diff --git a/QueryList.class.php b/QueryList.class.php index 3666f2d..3d7484f 100644 --- a/QueryList.class.php +++ b/QueryList.class.php @@ -7,13 +7,13 @@ * @author Jaeger * @email 734708094@qq.com * @link http://git.oschina.net/jae/QueryList - * @version 2.2.1 + * @version 3.0 * * @example * //获取CSDN移动开发栏目下的文章列表标题 $hj = QueryList::Query('http://mobile.csdn.net/',array("title"=>array('.unit h1','text'))); -print_r($hj->jsonArr); +print_r($hj->data); //回调函数1 function callfun1($content,$key) @@ -36,26 +36,29 @@ $reg = array( 'callback'=>array('HJ','callfun2') //调用回调函数2作为全局回调函数 ); $rang = '.left'; -$hj = QueryList::Query($url,$reg,$rang,'curl'); -print_r($hj->jsonArr); +$hj = QueryList::Query($url,$reg,$rang); +print_r($hj->data); //继续获取右边相关热门文章列表的标题以及链接地址 $hj->setQuery(array('title'=>array('','text'),'url'=>array('a','href')),'#con_two_2 li'); -//输出json数据 -echo $hj->getJson(); +//输出数据 +echo $hj->getData(); */ require 'phpQuery/phpQuery.php'; class QueryList { private $regArr; - public $jsonArr; + public $data; private $regRange; - private $html; - private $outputEncoding; + public $html; + private $pqHtml; + private $outputEncoding = false; + private $inputEncoding = false; private $htmlEncoding; - private static $ql; - private function __construct() { + public static $instances; + + public function __construct() { } /** * 静态方法,访问入口 @@ -67,72 +70,114 @@ class QueryList * 【回调函数】/【全局回调函数】:可选,字符串(函数名) 或 数组(array("类名","类的静态方法")),回调函数应有俩个参数,第一个参数是选择到的内容,第二个参数是选择器数组下标,回调函数会覆盖全局回调函数 * * @param string $regRange 【块选择器】:指 先按照规则 选出 几个大块 ,然后再分别再在块里面 进行相关的选择 - * @param string $getHtmlWay 【源码获取方式】指是通过curl抓取源码,还是通过file_get_contents抓取源码 * @param string $outputEncoding【输出编码格式】指要以什么编码输出(UTF-8,GB2312,.....),防止出现乱码,如果设置为 假值 则不改变原字符串编码 + * @param string $inputEncoding 【输入编码格式】明确指定输入的页面编码格式(UTF-8,GB2312,.....),防止出现乱码,如果设置为 假值 则自动识别 + * @param bool|false $removeHead 【是否移除页面头部区域】 乱码终极解决方案 + * @return mixed */ - public static function Query($page, $regArr, $regRange = '', $getHtmlWay = 'curl', $outputEncoding = false) + public static function Query($page,array $regArr, $regRange = '', $outputEncoding = null, $inputEncoding = null,$removeHead = false) { - if(!(self::$ql instanceof self)) - { - self::$ql = new self(); - } - self::$ql->_query($page, $regArr, $regRange, $getHtmlWay, $outputEncoding); - return self::$ql; + return self::getInstance()->_query($page, $regArr, $regRange, $outputEncoding, $inputEncoding,$removeHead); } + + /** + * 运行QueryList扩展 + * @param $class + * @param array $args + * @return mixed + * @throws QueryList_Exception + */ + public static function run($class,$args = array()) + { + $extension = self::getInstance($class); + return $extension->run($args); + } + + /** + * 获取任意实例 + * @return mixed + * @throws QueryList_Exception + */ + public static function getInstance() + { + $args = func_get_args(); + count($args) || $args = array(self::class); + $key = md5(serialize($args)); + $className = array_shift($args); + if(!class_exists($className)) { + throw new QueryList_Exception("no class {$className}"); + } + if(!isset(self::$instances[$key])) { + $rc = new ReflectionClass($className); + self::$instances[$key] = $rc->newInstanceArgs($args); + } + return self::$instances[$key]; + } + + /** + * 获取目标页面源码(主要用于调试) + * @param bool|true $rel + * @return string + */ + public function getHtml($rel = true) + { + return $rel?$this->qpHtml:$this->html; + } + + /** + * 获取采集结果数据 + * @param callback $callback + * @return array + */ + public function getData($callback = null) + { + if(is_callable($callback)){ + return array_map($callback,$this->data); + } + return $this->data; + } + /** * 重新设置选择器 - * @param array $regArr 选择器数组 - * @param string $regRange 块选择器 + * @param $regArr + * @param string $regRange + * @param string $outputEncoding + * @param string $inputEncoding + * @param bool|false $removeHead + * @return QueryList */ - public function setQuery($regArr, $regRange = '') + public function setQuery(array $regArr, $regRange = '',$outputEncoding = null, $inputEncoding = null,$removeHead = false) { - $this->jsonArr = array(); + return $this->_query($this->html,$regArr, $regRange, $outputEncoding, $inputEncoding,$removeHead); + } + + private function _query($page,array $regArr, $regRange, $outputEncoding, $inputEncoding,$removeHead) + { + $this->data = array(); + $this->html = $this->_isURL($page)?$this->_request($page):$page; + $outputEncoding && $this->outputEncoding = $outputEncoding; + $inputEncoding && $this->inputEncoding = $inputEncoding; + $removeHead && $this->html = $this->_removeHead($this->html); + $this->pqHtml = ''; + if(empty($this->html)){ + trigger_error("The received content is empty!",E_USER_NOTICE); + } + //获取编码格式 + $this->htmlEncoding = $this->inputEncoding?$this->inputEncoding:$this->_getEncode($this->html); + // $this->html = $this->_removeTags($this->html,array('script','style')); $this->regArr = $regArr; $this->regRange = $regRange; $this->_getList(); + return $this; } - /** - * 得到JSON结构的结果 - * @return string - */ - public function getJSON() - { - return json_encode($this->jsonArr); - } - private function _query($page, $regArr, $regRange, $getHtmlWay, $outputEncoding) - { - $this->jsonArr = array(); - $this->outputEncoding = $outputEncoding; - if ($this->_isURL($page)) { - if ($getHtmlWay == 'curl') { - //为了能获取https:// - $ch = curl_init(); - curl_setopt($ch, CURLOPT_URL, $page); - curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); - curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); - curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); - $this->html = curl_exec($ch); - curl_close($ch); - } else { - $this->html = file_get_contents($page); - } - } else { - $this->html = $page; - } - //获取编码格式 - $this->htmlEncoding = $this->_getEncode($this->html); - // $this->html = $this->_removeTags($this->html,array('script','style')); - if (!empty($regArr)) { - $this->regArr = $regArr; - $this->regRange = $regRange; - $this->_getList(); - } - } + private function _getList() { - $hobj = phpQuery::newDocumentHTML($this->html); + $this->inputEncoding && phpQuery::$defaultCharset = $this->inputEncoding; + $document = phpQuery::newDocumentHTML($this->html); + $this->qpHtml = $document->htmlOuter(); if (!empty($this->regRange)) { - $robj = pq($hobj)->find($this->regRange); + $robj = pq($document)->find($this->regRange); $i = 0; foreach ($robj as $item) { while (list($key, $reg_value) = each($this->regArr)) { @@ -142,20 +187,20 @@ class QueryList switch ($reg_value[1]) { case 'text': - $this->jsonArr[$i][$key] = $this->_allowTags(pq($iobj)->html(),$tags); + $this->data[$i][$key] = $this->_allowTags(pq($iobj)->html(),$tags); break; case 'html': - $this->jsonArr[$i][$key] = $this->_stripTags(pq($iobj)->html(),$tags); + $this->data[$i][$key] = $this->_stripTags(pq($iobj)->html(),$tags); break; default: - $this->jsonArr[$i][$key] = pq($iobj)->attr($reg_value[1]); + $this->data[$i][$key] = pq($iobj)->attr($reg_value[1]); break; } if(isset($reg_value[3])){ - $this->jsonArr[$i][$key] = call_user_func($reg_value[3],$this->jsonArr[$i][$key],$key); + $this->data[$i][$key] = call_user_func($reg_value[3],$this->data[$i][$key],$key); }else if(isset($this->regArr['callback'])){ - $this->jsonArr[$i][$key] = call_user_func($this->regArr['callback'],$this->jsonArr[$i][$key],$key); + $this->data[$i][$key] = call_user_func($this->regArr['callback'],$this->data[$i][$key],$key); } } //重置数组指针 @@ -165,27 +210,27 @@ class QueryList } else { while (list($key, $reg_value) = each($this->regArr)) { if($key=='callback')continue; - $hobj = phpQuery::newDocumentHTML($this->html); + $document = phpQuery::newDocumentHTML($this->html); $tags = isset($reg_value[2])?$reg_value[2]:''; - $lobj = pq($hobj)->find($reg_value[0]); + $lobj = pq($document)->find($reg_value[0]); $i = 0; foreach ($lobj as $item) { switch ($reg_value[1]) { case 'text': - $this->jsonArr[$i][$key] = $this->_allowTags(pq($item)->html(),$tags); + $this->data[$i][$key] = $this->_allowTags(pq($item)->html(),$tags); break; case 'html': - $this->jsonArr[$i][$key] = $this->_stripTags(pq($item)->html(),$tags); + $this->data[$i][$key] = $this->_stripTags(pq($item)->html(),$tags); break; default: - $this->jsonArr[$i][$key] = pq($item)->attr($reg_value[1]); + $this->data[$i][$key] = pq($item)->attr($reg_value[1]); break; } if(isset($reg_value[3])){ - $this->jsonArr[$i][$key] = call_user_func($reg_value[3],$this->jsonArr[$i][$key],$key); + $this->data[$i][$key] = call_user_func($reg_value[3],$this->data[$i][$key],$key); }else if(isset($this->regArr['callback'])){ - $this->jsonArr[$i][$key] = call_user_func($this->regArr['callback'],$this->jsonArr[$i][$key],$key); + $this->data[$i][$key] = call_user_func($this->regArr['callback'],$this->data[$i][$key],$key); } $i++; @@ -194,10 +239,52 @@ class QueryList } if ($this->outputEncoding) { //编码转换 - $this->jsonArr = $this->_arrayConvertEncoding($this->jsonArr, $this->outputEncoding, $this->htmlEncoding); + $this->data = $this->_arrayConvertEncoding($this->data, $this->outputEncoding, $this->htmlEncoding); } phpQuery::$documents = array(); } + + /** + * URL请求 + * @param $url + * @return string + */ + private function _request($url) + { + if(function_exists('curl_init')){ + $ch = curl_init(); + curl_setopt($ch, CURLOPT_URL, $url); + curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); + curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); + curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); + curl_setopt($ch, CURLOPT_AUTOREFERER, true); + curl_setopt($ch, CURLOPT_REFERER, $url); + curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); + $result = curl_exec($ch); + curl_close($ch); + }elseif(version_compare(PHP_VERSION, '5.0.0')>=0){ + $opts = array( + 'http' => array( + 'header' => "Referer:{$url}" + ) + ); + $result = file_get_contents($url,false,stream_context_create($opts)); + }else{ + $result = file_get_contents($url); + } + return $result; + } + + /** + * 移除页面head区域代码 + * @param $html + * @return mixed + */ + private function _removeHead($html) + { + return preg_replace('/
"; -print_r($arr); -echo "
"; -print_r($arr); -echo "
+ * $myDocumentId;
+ * phpQuery::newDocument('')
+ * ->getDocumentIDRef($myDocumentId)
+ * ->find('div')->...
+ *
+ *
+ * @param unknown_type $domId
+ * @see phpQuery::newDocument
+ * @see phpQuery::newDocumentFile
+ * @return phpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery
+ */
+ public function getDocumentIDRef(&$documentID) {
+ $documentID = $this->getDocumentID();
+ return $this;
+ }
+ /**
+ * Returns object with stack set to document root.
+ *
+ * @return phpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery
+ */
+ public function getDocument() {
+ return phpQuery::getDocument($this->getDocumentID());
+ }
+ /**
+ *
+ * @return DOMDocument
+ */
+ public function getDOMDocument() {
+ return $this->document;
+ }
+ /**
+ * Get object's Document ID.
+ *
+ * @return phpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery
+ */
+ public function getDocumentID() {
+ return $this->documentID;
+ }
+ /**
+ * Unloads whole document from memory.
+ * CAUTION! None further operations will be possible on this document.
+ * All objects refering to it will be useless.
+ *
+ * @return phpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery
+ */
+ public function unloadDocument() {
+ phpQuery::unloadDocuments($this->getDocumentID());
+ }
+ public function isHTML() {
+ return $this->documentWrapper->isHTML;
+ }
+ public function isXHTML() {
+ return $this->documentWrapper->isXHTML;
+ }
+ public function isXML() {
+ return $this->documentWrapper->isXML;
+ }
+ /**
+ * Enter description here...
+ *
+ * @link http://docs.jquery.com/Ajax/serialize
+ * @return string
+ */
+ public function serialize() {
+ return phpQuery::param($this->serializeArray());
+ }
+ /**
+ * Enter description here...
+ *
+ * @link http://docs.jquery.com/Ajax/serializeArray
+ * @return array
+ */
+ public function serializeArray($submit = null) {
+ $source = $this->filter('form, input, select, textarea')
+ ->find('input, select, textarea')
+ ->andSelf()
+ ->not('form');
+ $return = array();
+// $source->dumpDie();
+ foreach($source as $input) {
+ $input = phpQuery::pq($input);
+ if ($input->is('[disabled]'))
+ continue;
+ if (!$input->is('[name]'))
+ continue;
+ if ($input->is('[type=checkbox]') && !$input->is('[checked]'))
+ continue;
+ // jquery diff
+ if ($submit && $input->is('[type=submit]')) {
+ if ($submit instanceof DOMELEMENT && ! $input->elements[0]->isSameNode($submit))
+ continue;
+ else if (is_string($submit) && $input->attr('name') != $submit)
+ continue;
+ }
+ $return[] = array(
+ 'name' => $input->attr('name'),
+ 'value' => $input->val(),
+ );
+ }
+ return $return;
+ }
+ /**
+ * @access private
+ */
+ protected function debug($in) {
+ if (! phpQuery::$debug )
+ return;
+ print(''); + print_r($in); + // file debug +// file_put_contents(dirname(__FILE__).'/phpQuery.log', print_r($in, true)."\n", FILE_APPEND); + // quite handy debug trace +// if ( is_array($in)) +// print_r(array_slice(debug_backtrace(), 3)); + print("\n"); + } + /** + * @access private + */ + protected function isRegexp($pattern) { + return in_array( + $pattern[ mb_strlen($pattern)-1 ], + array('^','*','$') + ); + } + /** + * Determines if $char is really a char. + * + * @param string $char + * @return bool + * @todo rewrite me to charcode range ! ;) + * @access private + */ + protected function isChar($char) { + return extension_loaded('mbstring') && phpQuery::$mbstringSupport + ? mb_eregi('\w', $char) + : preg_match('@\w@', $char); + } + /** + * @access private + */ + protected function parseSelector($query) { + // clean spaces + // TODO include this inside parsing ? + $query = trim( + preg_replace('@\s+@', ' ', + preg_replace('@\s*(>|\\+|~)\s*@', '\\1', $query) + ) + ); + $queries = array(array()); + if (! $query) + return $queries; + $return =& $queries[0]; + $specialChars = array('>',' '); +// $specialCharsMapping = array('/' => '>'); + $specialCharsMapping = array(); + $strlen = mb_strlen($query); + $classChars = array('.', '-'); + $pseudoChars = array('-'); + $tagChars = array('*', '|', '-'); + // split multibyte string + // http://code.google.com/p/phpquery/issues/detail?id=76 + $_query = array(); + for ($i=0; $i<$strlen; $i++) + $_query[] = mb_substr($query, $i, 1); + $query = $_query; + // it works, but i dont like it... + $i = 0; + while( $i < $strlen) { + $c = $query[$i]; + $tmp = ''; + // TAG + if ($this->isChar($c) || in_array($c, $tagChars)) { + while(isset($query[$i]) + && ($this->isChar($query[$i]) || in_array($query[$i], $tagChars))) { + $tmp .= $query[$i]; + $i++; + } + $return[] = $tmp; + // IDs + } else if ( $c == '#') { + $i++; + while( isset($query[$i]) && ($this->isChar($query[$i]) || $query[$i] == '-')) { + $tmp .= $query[$i]; + $i++; + } + $return[] = '#'.$tmp; + // SPECIAL CHARS + } else if (in_array($c, $specialChars)) { + $return[] = $c; + $i++; + // MAPPED SPECIAL MULTICHARS +// } else if ( $c.$query[$i+1] == '//') { +// $return[] = ' '; +// $i = $i+2; + // MAPPED SPECIAL CHARS + } else if ( isset($specialCharsMapping[$c])) { + $return[] = $specialCharsMapping[$c]; + $i++; + // COMMA + } else if ( $c == ',') { + $queries[] = array(); + $return =& $queries[ count($queries)-1 ]; + $i++; + while( isset($query[$i]) && $query[$i] == ' ') + $i++; + // CLASSES + } else if ($c == '.') { + while( isset($query[$i]) && ($this->isChar($query[$i]) || in_array($query[$i], $classChars))) { + $tmp .= $query[$i]; + $i++; + } + $return[] = $tmp; + // ~ General Sibling Selector + } else if ($c == '~') { + $spaceAllowed = true; + $tmp .= $query[$i++]; + while( isset($query[$i]) + && ($this->isChar($query[$i]) + || in_array($query[$i], $classChars) + || $query[$i] == '*' + || ($query[$i] == ' ' && $spaceAllowed) + )) { + if ($query[$i] != ' ') + $spaceAllowed = false; + $tmp .= $query[$i]; + $i++; + } + $return[] = $tmp; + // + Adjacent sibling selectors + } else if ($c == '+') { + $spaceAllowed = true; + $tmp .= $query[$i++]; + while( isset($query[$i]) + && ($this->isChar($query[$i]) + || in_array($query[$i], $classChars) + || $query[$i] == '*' + || ($spaceAllowed && $query[$i] == ' ') + )) { + if ($query[$i] != ' ') + $spaceAllowed = false; + $tmp .= $query[$i]; + $i++; + } + $return[] = $tmp; + // ATTRS + } else if ($c == '[') { + $stack = 1; + $tmp .= $c; + while( isset($query[++$i])) { + $tmp .= $query[$i]; + if ( $query[$i] == '[') { + $stack++; + } else if ( $query[$i] == ']') { + $stack--; + if (! $stack ) + break; + } + } + $return[] = $tmp; + $i++; + // PSEUDO CLASSES + } else if ($c == ':') { + $stack = 1; + $tmp .= $query[$i++]; + while( isset($query[$i]) && ($this->isChar($query[$i]) || in_array($query[$i], $pseudoChars))) { + $tmp .= $query[$i]; + $i++; + } + // with arguments ? + if ( isset($query[$i]) && $query[$i] == '(') { + $tmp .= $query[$i]; + $stack = 1; + while( isset($query[++$i])) { + $tmp .= $query[$i]; + if ( $query[$i] == '(') { + $stack++; + } else if ( $query[$i] == ')') { + $stack--; + if (! $stack ) + break; + } + } + $return[] = $tmp; + $i++; + } else { + $return[] = $tmp; + } + } else { + $i++; + } + } + foreach($queries as $k => $q) { + if (isset($q[0])) { + if (isset($q[0][0]) && $q[0][0] == ':') + array_unshift($queries[$k], '*'); + if ($q[0] != '>') + array_unshift($queries[$k], ' '); + } + } + return $queries; + } + /** + * Return matched DOM nodes. + * + * @param int $index + * @return array|DOMElement Single DOMElement or array of DOMElement. + */ + public function get($index = null, $callback1 = null, $callback2 = null, $callback3 = null) { + $return = isset($index) + ? (isset($this->elements[$index]) ? $this->elements[$index] : null) + : $this->elements; + // pass thou callbacks + $args = func_get_args(); + $args = array_slice($args, 1); + foreach($args as $callback) { + if (is_array($return)) + foreach($return as $k => $v) + $return[$k] = phpQuery::callbackRun($callback, array($v)); + else + $return = phpQuery::callbackRun($callback, array($return)); + } + return $return; + } + /** + * Return matched DOM nodes. + * jQuery difference. + * + * @param int $index + * @return array|string Returns string if $index != null + * @todo implement callbacks + * @todo return only arrays ? + * @todo maybe other name... + */ + public function getString($index = null, $callback1 = null, $callback2 = null, $callback3 = null) { + if ($index) + $return = $this->eq($index)->text(); + else { + $return = array(); + for($i = 0; $i < $this->size(); $i++) { + $return[] = $this->eq($i)->text(); + } + } + // pass thou callbacks + $args = func_get_args(); + $args = array_slice($args, 1); + foreach($args as $callback) { + $return = phpQuery::callbackRun($callback, array($return)); + } + return $return; + } + /** + * Return matched DOM nodes. + * jQuery difference. + * + * @param int $index + * @return array|string Returns string if $index != null + * @todo implement callbacks + * @todo return only arrays ? + * @todo maybe other name... + */ + public function getStrings($index = null, $callback1 = null, $callback2 = null, $callback3 = null) { + if ($index) + $return = $this->eq($index)->text(); + else { + $return = array(); + for($i = 0; $i < $this->size(); $i++) { + $return[] = $this->eq($i)->text(); + } + // pass thou callbacks + $args = func_get_args(); + $args = array_slice($args, 1); + } + foreach($args as $callback) { + if (is_array($return)) + foreach($return as $k => $v) + $return[$k] = phpQuery::callbackRun($callback, array($v)); + else + $return = phpQuery::callbackRun($callback, array($return)); + } + return $return; + } + /** + * Returns new instance of actual class. + * + * @param array $newStack Optional. Will replace old stack with new and move old one to history.c + */ + public function newInstance($newStack = null) { + $class = get_class($this); + // support inheritance by passing old object to overloaded constructor + $new = $class != 'phpQuery' + ? new $class($this, $this->getDocumentID()) + : new phpQueryObject($this->getDocumentID()); + $new->previous = $this; + if (is_null($newStack)) { + $new->elements = $this->elements; + if ($this->elementsBackup) + $this->elements = $this->elementsBackup; + } else if (is_string($newStack)) { + $new->elements = phpQuery::pq($newStack, $this->getDocumentID())->stack(); + } else { + $new->elements = $newStack; + } + return $new; + } + /** + * Enter description here... + * + * In the future, when PHP will support XLS 2.0, then we would do that this way: + * contains(tokenize(@class, '\s'), "something") + * @param unknown_type $class + * @param unknown_type $node + * @return boolean + * @access private + */ + protected function matchClasses($class, $node) { + // multi-class + if ( mb_strpos($class, '.', 1)) { + $classes = explode('.', substr($class, 1)); + $classesCount = count( $classes ); + $nodeClasses = explode(' ', $node->getAttribute('class') ); + $nodeClassesCount = count( $nodeClasses ); + if ( $classesCount > $nodeClassesCount ) + return false; + $diff = count( + array_diff( + $classes, + $nodeClasses + ) + ); + if (! $diff ) + return true; + // single-class + } else { + return in_array( + // strip leading dot from class name + substr($class, 1), + // get classes for element as array + explode(' ', $node->getAttribute('class') ) + ); + } + } + /** + * @access private + */ + protected function runQuery($XQuery, $selector = null, $compare = null) { + if ($compare && ! method_exists($this, $compare)) + return false; + $stack = array(); + if (! $this->elements) + $this->debug('Stack empty, skipping...'); +// var_dump($this->elements[0]->nodeType); + // element, document + foreach($this->stack(array(1, 9, 13)) as $k => $stackNode) { + $detachAfter = false; + // to work on detached nodes we need temporary place them somewhere + // thats because context xpath queries sucks ;] + $testNode = $stackNode; + while ($testNode) { + if (! $testNode->parentNode && ! $this->isRoot($testNode)) { + $this->root->appendChild($testNode); + $detachAfter = $testNode; + break; + } + $testNode = isset($testNode->parentNode) + ? $testNode->parentNode + : null; + } + // XXX tmp ? + $xpath = $this->documentWrapper->isXHTML + ? $this->getNodeXpath($stackNode, 'html') + : $this->getNodeXpath($stackNode); + // FIXME pseudoclasses-only query, support XML + $query = $XQuery == '//' && $xpath == '/html[1]' + ? '//*' + : $xpath.$XQuery; + $this->debug("XPATH: {$query}"); + // run query, get elements + $nodes = $this->xpath->query($query); + $this->debug("QUERY FETCHED"); + if (! $nodes->length ) + $this->debug('Nothing found'); + $debug = array(); + foreach($nodes as $node) { + $matched = false; + if ( $compare) { + phpQuery::$debug ? + $this->debug("Found: ".$this->whois( $node ).", comparing with {$compare}()") + : null; + $phpQueryDebug = phpQuery::$debug; + phpQuery::$debug = false; + // TODO ??? use phpQuery::callbackRun() + if (call_user_func_array(array($this, $compare), array($selector, $node))) + $matched = true; + phpQuery::$debug = $phpQueryDebug; + } else { + $matched = true; + } + if ( $matched) { + if (phpQuery::$debug) + $debug[] = $this->whois( $node ); + $stack[] = $node; + } + } + if (phpQuery::$debug) { + $this->debug("Matched ".count($debug).": ".implode(', ', $debug)); + } + if ($detachAfter) + $this->root->removeChild($detachAfter); + } + $this->elements = $stack; + } + /** + * Enter description here... + * + * @return phpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery + */ + public function find($selectors, $context = null, $noHistory = false) { + if (!$noHistory) + // backup last stack /for end()/ + $this->elementsBackup = $this->elements; + // allow to define context + // TODO combine code below with phpQuery::pq() context guessing code + // as generic function + if ($context) { + if (! is_array($context) && $context instanceof DOMELEMENT) + $this->elements = array($context); + else if (is_array($context)) { + $this->elements = array(); + foreach ($context as $c) + if ($c instanceof DOMELEMENT) + $this->elements[] = $c; + } else if ( $context instanceof self ) + $this->elements = $context->elements; + } + $queries = $this->parseSelector($selectors); + $this->debug(array('FIND', $selectors, $queries)); + $XQuery = ''; + // remember stack state because of multi-queries + $oldStack = $this->elements; + // here we will be keeping found elements + $stack = array(); + foreach($queries as $selector) { + $this->elements = $oldStack; + $delimiterBefore = false; + foreach($selector as $s) { + // TAG + $isTag = extension_loaded('mbstring') && phpQuery::$mbstringSupport + ? mb_ereg_match('^[\w|\||-]+$', $s) || $s == '*' + : preg_match('@^[\w|\||-]+$@', $s) || $s == '*'; + if ($isTag) { + if ($this->isXML()) { + // namespace support + if (mb_strpos($s, '|') !== false) { + $ns = $tag = null; + list($ns, $tag) = explode('|', $s); + $XQuery .= "$ns:$tag"; + } else if ($s == '*') { + $XQuery .= "*"; + } else { + $XQuery .= "*[local-name()='$s']"; + } + } else { + $XQuery .= $s; + } + // ID + } else if ($s[0] == '#') { + if ($delimiterBefore) + $XQuery .= '*'; + $XQuery .= "[@id='".substr($s, 1)."']"; + // ATTRIBUTES + } else if ($s[0] == '[') { + if ($delimiterBefore) + $XQuery .= '*'; + // strip side brackets + $attr = trim($s, ']['); + $execute = false; + // attr with specifed value + if (mb_strpos($s, '=')) { + $value = null; + list($attr, $value) = explode('=', $attr); + $value = trim($value, "'\""); + if ($this->isRegexp($attr)) { + // cut regexp character + $attr = substr($attr, 0, -1); + $execute = true; + $XQuery .= "[@{$attr}]"; + } else { + $XQuery .= "[@{$attr}='{$value}']"; + } + // attr without specified value + } else { + $XQuery .= "[@{$attr}]"; + } + if ($execute) { + $this->runQuery($XQuery, $s, 'is'); + $XQuery = ''; + if (! $this->length()) + break; + } + // CLASSES + } else if ($s[0] == '.') { + // TODO use return $this->find("./self::*[contains(concat(\" \",@class,\" \"), \" $class \")]"); + // thx wizDom ;) + if ($delimiterBefore) + $XQuery .= '*'; + $XQuery .= '[@class]'; + $this->runQuery($XQuery, $s, 'matchClasses'); + $XQuery = ''; + if (! $this->length() ) + break; + // ~ General Sibling Selector + } else if ($s[0] == '~') { + $this->runQuery($XQuery); + $XQuery = ''; + $this->elements = $this + ->siblings( + substr($s, 1) + )->elements; + if (! $this->length() ) + break; + // + Adjacent sibling selectors + } else if ($s[0] == '+') { + // TODO /following-sibling:: + $this->runQuery($XQuery); + $XQuery = ''; + $subSelector = substr($s, 1); + $subElements = $this->elements; + $this->elements = array(); + foreach($subElements as $node) { + // search first DOMElement sibling + $test = $node->nextSibling; + while($test && ! ($test instanceof DOMELEMENT)) + $test = $test->nextSibling; + if ($test && $this->is($subSelector, $test)) + $this->elements[] = $test; + } + if (! $this->length() ) + break; + // PSEUDO CLASSES + } else if ($s[0] == ':') { + // TODO optimization for :first :last + if ($XQuery) { + $this->runQuery($XQuery); + $XQuery = ''; + } + if (! $this->length()) + break; + $this->pseudoClasses($s); + if (! $this->length()) + break; + // DIRECT DESCENDANDS + } else if ($s == '>') { + $XQuery .= '/'; + $delimiterBefore = 2; + // ALL DESCENDANDS + } else if ($s == ' ') { + $XQuery .= '//'; + $delimiterBefore = 2; + // ERRORS + } else { + phpQuery::debug("Unrecognized token '$s'"); + } + $delimiterBefore = $delimiterBefore === 2; + } + // run query if any + if ($XQuery && $XQuery != '//') { + $this->runQuery($XQuery); + $XQuery = ''; + } + foreach($this->elements as $node) + if (! $this->elementsContainsNode($node, $stack)) + $stack[] = $node; + } + $this->elements = $stack; + return $this->newInstance(); + } + /** + * @todo create API for classes with pseudoselectors + * @access private + */ + protected function pseudoClasses($class) { + // TODO clean args parsing ? + $class = ltrim($class, ':'); + $haveArgs = mb_strpos($class, '('); + if ($haveArgs !== false) { + $args = substr($class, $haveArgs+1, -1); + $class = substr($class, 0, $haveArgs); + } + switch($class) { + case 'even': + case 'odd': + $stack = array(); + foreach($this->elements as $i => $node) { + if ($class == 'even' && ($i%2) == 0) + $stack[] = $node; + else if ( $class == 'odd' && $i % 2 ) + $stack[] = $node; + } + $this->elements = $stack; + break; + case 'eq': + $k = intval($args); + $this->elements = isset( $this->elements[$k] ) + ? array( $this->elements[$k] ) + : array(); + break; + case 'gt': + $this->elements = array_slice($this->elements, $args+1); + break; + case 'lt': + $this->elements = array_slice($this->elements, 0, $args+1); + break; + case 'first': + if (isset($this->elements[0])) + $this->elements = array($this->elements[0]); + break; + case 'last': + if ($this->elements) + $this->elements = array($this->elements[count($this->elements)-1]); + break; + /*case 'parent': + $stack = array(); + foreach($this->elements as $node) { + if ( $node->childNodes->length ) + $stack[] = $node; + } + $this->elements = $stack; + break;*/ + case 'contains': + $text = trim($args, "\"'"); + $stack = array(); + foreach($this->elements as $node) { + if (mb_stripos($node->textContent, $text) === false) + continue; + $stack[] = $node; + } + $this->elements = $stack; + break; + case 'not': + $selector = self::unQuote($args); + $this->elements = $this->not($selector)->stack(); + break; + case 'slice': + // TODO jQuery difference ? + $args = explode(',', + str_replace(', ', ',', trim($args, "\"'")) + ); + $start = $args[0]; + $end = isset($args[1]) + ? $args[1] + : null; + if ($end > 0) + $end = $end-$start; + $this->elements = array_slice($this->elements, $start, $end); + break; + case 'has': + $selector = trim($args, "\"'"); + $stack = array(); + foreach($this->stack(1) as $el) { + if ($this->find($selector, $el, true)->length) + $stack[] = $el; + } + $this->elements = $stack; + break; + case 'submit': + case 'reset': + $this->elements = phpQuery::merge( + $this->map(array($this, 'is'), + "input[type=$class]", new CallbackParam() + ), + $this->map(array($this, 'is'), + "button[type=$class]", new CallbackParam() + ) + ); + break; +// $stack = array(); +// foreach($this->elements as $node) +// if ($node->is('input[type=submit]') || $node->is('button[type=submit]')) +// $stack[] = $el; +// $this->elements = $stack; + case 'input': + $this->elements = $this->map( + array($this, 'is'), + 'input', new CallbackParam() + )->elements; + break; + case 'password': + case 'checkbox': + case 'radio': + case 'hidden': + case 'image': + case 'file': + $this->elements = $this->map( + array($this, 'is'), + "input[type=$class]", new CallbackParam() + )->elements; + break; + case 'parent': + $this->elements = $this->map( + create_function('$node', ' + return $node instanceof DOMELEMENT && $node->childNodes->length + ? $node : null;') + )->elements; + break; + case 'empty': + $this->elements = $this->map( + create_function('$node', ' + return $node instanceof DOMELEMENT && $node->childNodes->length + ? null : $node;') + )->elements; + break; + case 'disabled': + case 'selected': + case 'checked': + $this->elements = $this->map( + array($this, 'is'), + "[$class]", new CallbackParam() + )->elements; + break; + case 'enabled': + $this->elements = $this->map( + create_function('$node', ' + return pq($node)->not(":disabled") ? $node : null;') + )->elements; + break; + case 'header': + $this->elements = $this->map( + create_function('$node', + '$isHeader = isset($node->tagName) && in_array($node->tagName, array( + "h1", "h2", "h3", "h4", "h5", "h6", "h7" + )); + return $isHeader + ? $node + : null;') + )->elements; +// $this->elements = $this->map( +// create_function('$node', '$node = pq($node); +// return $node->is("h1") +// || $node->is("h2") +// || $node->is("h3") +// || $node->is("h4") +// || $node->is("h5") +// || $node->is("h6") +// || $node->is("h7") +// ? $node +// : null;') +// )->elements; + break; + case 'only-child': + $this->elements = $this->map( + create_function('$node', + 'return pq($node)->siblings()->size() == 0 ? $node : null;') + )->elements; + break; + case 'first-child': + $this->elements = $this->map( + create_function('$node', 'return pq($node)->prevAll()->size() == 0 ? $node : null;') + )->elements; + break; + case 'last-child': + $this->elements = $this->map( + create_function('$node', 'return pq($node)->nextAll()->size() == 0 ? $node : null;') + )->elements; + break; + case 'nth-child': + $param = trim($args, "\"'"); + if (! $param) + break; + // nth-child(n+b) to nth-child(1n+b) + if ($param{0} == 'n') + $param = '1'.$param; + // :nth-child(index/even/odd/equation) + if ($param == 'even' || $param == 'odd') + $mapped = $this->map( + create_function('$node, $param', + '$index = pq($node)->prevAll()->size()+1; + if ($param == "even" && ($index%2) == 0) + return $node; + else if ($param == "odd" && $index%2 == 1) + return $node; + else + return null;'), + new CallbackParam(), $param + ); + else if (mb_strlen($param) > 1 && $param{1} == 'n') + // 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; + if ($a > 0) { + return ($index-$b)%$a == 0 + ? $node + : null; + phpQuery::debug($a."*".floor($index/$a)."+$b-1 == ".($a*floor($index/$a)+$b-1)." ?= $prevs"); + return $a*floor($index/$a)+$b-1 == $prevs + ? $node + : null; + } else if ($a == 0) + return $index == $b + ? $node + : null; + else + // negative value + return $index <= $b + ? $node + : null; +// if (! $b) +// return $index%$a == 0 +// ? $node +// : null; +// else +// return ($index-$b)%$a == 0 +// ? $node +// : null; + '), + new CallbackParam(), $param + ); + else + // index + $mapped = $this->map( + create_function('$node, $index', + '$prevs = pq($node)->prevAll()->size(); + if ($prevs && $prevs == $index-1) + return $node; + else if (! $prevs && $index == 1) + return $node; + else + return null;'), + new CallbackParam(), $param + ); + $this->elements = $mapped->elements; + break; + default: + $this->debug("Unknown pseudoclass '{$class}', skipping..."); + } + } + /** + * @access private + */ + protected function __pseudoClassParam($paramsString) { + // TODO; + } + /** + * Enter description here... + * + * @return phpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery + */ + public function is($selector, $nodes = null) { + phpQuery::debug(array("Is:", $selector)); + if (! $selector) + return false; + $oldStack = $this->elements; + $returnArray = false; + if ($nodes && is_array($nodes)) { + $this->elements = $nodes; + } else if ($nodes) + $this->elements = array($nodes); + $this->filter($selector, true); + $stack = $this->elements; + $this->elements = $oldStack; + if ($nodes) + return $stack ? $stack : null; + return (bool)count($stack); + } + /** + * Enter description here... + * jQuery difference. + * + * Callback: + * - $index int + * - $node DOMNode + * + * @return phpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery + * @link http://docs.jquery.com/Traversing/filter + */ + public function filterCallback($callback, $_skipHistory = false) { + if (! $_skipHistory) { + $this->elementsBackup = $this->elements; + $this->debug("Filtering by callback"); + } + $newStack = array(); + foreach($this->elements as $index => $node) { + $result = phpQuery::callbackRun($callback, array($index, $node)); + if (is_null($result) || (! is_null($result) && $result)) + $newStack[] = $node; + } + $this->elements = $newStack; + return $_skipHistory + ? $this + : $this->newInstance(); + } + /** + * Enter description here... + * + * @return phpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery + * @link http://docs.jquery.com/Traversing/filter + */ + public function filter($selectors, $_skipHistory = false) { + if ($selectors instanceof Callback OR $selectors instanceof Closure) + return $this->filterCallback($selectors, $_skipHistory); + if (! $_skipHistory) + $this->elementsBackup = $this->elements; + $notSimpleSelector = array(' ', '>', '~', '+', '/'); + if (! is_array($selectors)) + $selectors = $this->parseSelector($selectors); + if (! $_skipHistory) + $this->debug(array("Filtering:", $selectors)); + $finalStack = array(); + foreach($selectors as $selector) { + $stack = array(); + if (! $selector) + break; + // avoid first space or / + if (in_array($selector[0], $notSimpleSelector)) + $selector = array_slice($selector, 1); + // PER NODE selector chunks + foreach($this->stack() as $node) { + $break = false; + foreach($selector as $s) { + if (!($node instanceof DOMELEMENT)) { + // all besides DOMElement + if ( $s[0] == '[') { + $attr = trim($s, '[]'); + if ( mb_strpos($attr, '=')) { + list( $attr, $val ) = explode('=', $attr); + if ($attr == 'nodeType' && $node->nodeType != $val) + $break = true; + } + } else + $break = true; + } else { + // DOMElement only + // ID + if ( $s[0] == '#') { + if ( $node->getAttribute('id') != substr($s, 1) ) + $break = true; + // CLASSES + } else if ( $s[0] == '.') { + if (! $this->matchClasses( $s, $node ) ) + $break = true; + // ATTRS + } else if ( $s[0] == '[') { + // strip side brackets + $attr = trim($s, '[]'); + if (mb_strpos($attr, '=')) { + list($attr, $val) = explode('=', $attr); + $val = self::unQuote($val); + if ($attr == 'nodeType') { + if ($val != $node->nodeType) + $break = true; + } else if ($this->isRegexp($attr)) { + $val = extension_loaded('mbstring') && phpQuery::$mbstringSupport + ? quotemeta(trim($val, '"\'')) + : preg_quote(trim($val, '"\''), '@'); + // switch last character + switch( substr($attr, -1)) { + // quotemeta used insted of preg_quote + // http://code.google.com/p/phpquery/issues/detail?id=76 + case '^': + $pattern = '^'.$val; + break; + case '*': + $pattern = '.*'.$val.'.*'; + break; + case '$': + $pattern = '.*'.$val.'$'; + break; + } + // cut last character + $attr = substr($attr, 0, -1); + $isMatch = extension_loaded('mbstring') && phpQuery::$mbstringSupport + ? mb_ereg_match($pattern, $node->getAttribute($attr)) + : preg_match("@{$pattern}@", $node->getAttribute($attr)); + if (! $isMatch) + $break = true; + } else if ($node->getAttribute($attr) != $val) + $break = true; + } else if (! $node->hasAttribute($attr)) + $break = true; + // PSEUDO CLASSES + } else if ( $s[0] == ':') { + // skip + // TAG + } else if (trim($s)) { + if ($s != '*') { + // TODO namespaces + if (isset($node->tagName)) { + if ($node->tagName != $s) + $break = true; + } else if ($s == 'html' && ! $this->isRoot($node)) + $break = true; + } + // AVOID NON-SIMPLE SELECTORS + } else if (in_array($s, $notSimpleSelector)) { + $break = true; + $this->debug(array('Skipping non simple selector', $selector)); + } + } + if ($break) + break; + } + // if element passed all chunks of selector - add it to new stack + if (! $break ) + $stack[] = $node; + } + $tmpStack = $this->elements; + $this->elements = $stack; + // PER ALL NODES selector chunks + foreach($selector as $s) + // PSEUDO CLASSES + if ($s[0] == ':') + $this->pseudoClasses($s); + foreach($this->elements as $node) + // XXX it should be merged without duplicates + // but jQuery doesnt do that + $finalStack[] = $node; + $this->elements = $tmpStack; + } + $this->elements = $finalStack; + if ($_skipHistory) { + return $this; + } else { + $this->debug("Stack length after filter(): ".count($finalStack)); + return $this->newInstance(); + } + } + /** + * + * @param $value + * @return unknown_type + * @TODO implement in all methods using passed parameters + */ + protected static function unQuote($value) { + return $value[0] == '\'' || $value[0] == '"' + ? substr($value, 1, -1) + : $value; + } + /** + * Enter description here... + * + * @link http://docs.jquery.com/Ajax/load + * @return phpQuery|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery + * @todo Support $selector + */ + public function load($url, $data = null, $callback = null) { + if ($data && ! is_array($data)) { + $callback = $data; + $data = null; + } + if (mb_strpos($url, ' ') !== false) { + $matches = null; + if (extension_loaded('mbstring') && phpQuery::$mbstringSupport) + mb_ereg('^([^ ]+) (.*)$', $url, $matches); + else + preg_match('^([^ ]+) (.*)$', $url, $matches); + $url = $matches[1]; + $selector = $matches[2]; + // FIXME this sucks, pass as callback param + $this->_loadSelector = $selector; + } + $ajax = array( + 'url' => $url, + 'type' => $data ? 'POST' : 'GET', + 'data' => $data, + 'complete' => $callback, + 'success' => array($this, '__loadSuccess') + ); + phpQuery::ajax($ajax); + return $this; + } + /** + * @access private + * @param $html + * @return unknown_type + */ + public function __loadSuccess($html) { + if ($this->_loadSelector) { + $html = phpQuery::newDocument($html)->find($this->_loadSelector); + unset($this->_loadSelector); + } + foreach($this->stack(1) as $node) { + phpQuery::pq($node, $this->getDocumentID()) + ->markup($html); + } + } + /** + * Enter description here... + * + * @return phpQuery|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery + * @todo + */ + public function css() { + // TODO + return $this; + } + /** + * @todo + * + */ + public function show(){ + // TODO + return $this; + } + /** + * @todo + * + */ + public function hide(){ + // TODO + return $this; + } + /** + * Trigger a type of event on every matched element. + * + * @param unknown_type $type + * @param unknown_type $data + * @return phpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery + * @TODO support more than event in $type (space-separated) + */ + public function trigger($type, $data = array()) { + foreach($this->elements as $node) + phpQueryEvents::trigger($this->getDocumentID(), $type, $data, $node); + return $this; + } + /** + * This particular method triggers all bound event handlers on an element (for a specific event type) WITHOUT executing the browsers default actions. + * + * @param unknown_type $type + * @param unknown_type $data + * @return phpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery + * @TODO + */ + public function triggerHandler($type, $data = array()) { + // TODO; + } + /** + * Binds a handler to one or more events (like click) for each matched element. + * Can also bind custom events. + * + * @param unknown_type $type + * @param unknown_type $data Optional + * @param unknown_type $callback + * @return phpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery + * @TODO support '!' (exclusive) events + * @TODO support more than event in $type (space-separated) + */ + public function bind($type, $data, $callback = null) { + // TODO check if $data is callable, not using is_callable + if (! isset($callback)) { + $callback = $data; + $data = null; + } + foreach($this->elements as $node) + phpQueryEvents::add($this->getDocumentID(), $node, $type, $data, $callback); + return $this; + } + /** + * Enter description here... + * + * @param unknown_type $type + * @param unknown_type $callback + * @return unknown + * @TODO namespace events + * @TODO support more than event in $type (space-separated) + */ + public function unbind($type = null, $callback = null) { + foreach($this->elements as $node) + phpQueryEvents::remove($this->getDocumentID(), $node, $type, $callback); + return $this; + } + /** + * Enter description here... + * + * @return phpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery + */ + public function change($callback = null) { + if ($callback) + return $this->bind('change', $callback); + return $this->trigger('change'); + } + /** + * Enter description here... + * + * @return phpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery + */ + public function submit($callback = null) { + if ($callback) + return $this->bind('submit', $callback); + return $this->trigger('submit'); + } + /** + * Enter description here... + * + * @return phpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery + */ + public function click($callback = null) { + if ($callback) + return $this->bind('click', $callback); + return $this->trigger('click'); + } + /** + * Enter description here... + * + * @param String|phpQuery + * @return phpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery + */ + public function wrapAllOld($wrapper) { + $wrapper = pq($wrapper)->_clone(); + if (! $wrapper->length() || ! $this->length() ) + return $this; + $wrapper->insertBefore($this->elements[0]); + $deepest = $wrapper->elements[0]; + while($deepest->firstChild && $deepest->firstChild instanceof DOMELEMENT) + $deepest = $deepest->firstChild; + pq($deepest)->append($this); + return $this; + } + /** + * Enter description here... + * + * TODO testme... + * @param String|phpQuery + * @return phpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery + */ + public function wrapAll($wrapper) { + if (! $this->length()) + return $this; + return phpQuery::pq($wrapper, $this->getDocumentID()) + ->clone() + ->insertBefore($this->get(0)) + ->map(array($this, '___wrapAllCallback')) + ->append($this); + } + /** + * + * @param $node + * @return unknown_type + * @access private + */ + public function ___wrapAllCallback($node) { + $deepest = $node; + while($deepest->firstChild && $deepest->firstChild instanceof DOMELEMENT) + $deepest = $deepest->firstChild; + return $deepest; + } + /** + * Enter description here... + * NON JQUERY METHOD + * + * @param String|phpQuery + * @return phpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery + */ + public function wrapAllPHP($codeBefore, $codeAfter) { + return $this + ->slice(0, 1) + ->beforePHP($codeBefore) + ->end() + ->slice(-1) + ->afterPHP($codeAfter) + ->end(); + } + /** + * Enter description here... + * + * @param String|phpQuery + * @return phpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery + */ + public function wrap($wrapper) { + foreach($this->stack() as $node) + phpQuery::pq($node, $this->getDocumentID())->wrapAll($wrapper); + return $this; + } + /** + * Enter description here... + * + * @param String|phpQuery + * @return phpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery + */ + public function wrapPHP($codeBefore, $codeAfter) { + foreach($this->stack() as $node) + phpQuery::pq($node, $this->getDocumentID())->wrapAllPHP($codeBefore, $codeAfter); + return $this; + } + /** + * Enter description here... + * + * @param String|phpQuery + * @return phpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery + */ + public function wrapInner($wrapper) { + foreach($this->stack() as $node) + phpQuery::pq($node, $this->getDocumentID())->contents()->wrapAll($wrapper); + return $this; + } + /** + * Enter description here... + * + * @param String|phpQuery + * @return phpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery + */ + public function wrapInnerPHP($codeBefore, $codeAfter) { + foreach($this->stack(1) as $node) + phpQuery::pq($node, $this->getDocumentID())->contents() + ->wrapAllPHP($codeBefore, $codeAfter); + return $this; + } + /** + * Enter description here... + * + * @return phpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery + * @testme Support for text nodes + */ + public function contents() { + $stack = array(); + foreach($this->stack(1) as $el) { + // FIXME (fixed) http://code.google.com/p/phpquery/issues/detail?id=56 +// if (! isset($el->childNodes)) +// continue; + foreach($el->childNodes as $node) { + $stack[] = $node; + } + } + return $this->newInstance($stack); + } + /** + * Enter description here... + * + * jQuery difference. + * + * @return phpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery + */ + public function contentsUnwrap() { + foreach($this->stack(1) as $node) { + if (! $node->parentNode ) + continue; + $childNodes = array(); + // any modification in DOM tree breaks childNodes iteration, so cache them first + foreach($node->childNodes as $chNode ) + $childNodes[] = $chNode; + foreach($childNodes as $chNode ) +// $node->parentNode->appendChild($chNode); + $node->parentNode->insertBefore($chNode, $node); + $node->parentNode->removeChild($node); + } + return $this; + } + /** + * Enter description here... + * + * jQuery difference. + */ + public function switchWith($markup) { + $markup = pq($markup, $this->getDocumentID()); + $content = null; + foreach($this->stack(1) as $node) { + pq($node) + ->contents()->toReference($content)->end() + ->replaceWith($markup->clone()->append($content)); + } + return $this; + } + /** + * Enter description here... + * + * @return phpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery + */ + public function eq($num) { + $oldStack = $this->elements; + $this->elementsBackup = $this->elements; + $this->elements = array(); + if ( isset($oldStack[$num]) ) + $this->elements[] = $oldStack[$num]; + return $this->newInstance(); + } + /** + * Enter description here... + * + * @return phpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery + */ + public function size() { + return count($this->elements); + } + /** + * Enter description here... + * + * @return phpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery + * @deprecated Use length as attribute + */ + public function length() { + return $this->size(); + } + public function count() { + return $this->size(); + } + /** + * Enter description here... + * + * @return phpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery + * @todo $level + */ + public function end($level = 1) { +// $this->elements = array_pop( $this->history ); +// return $this; +// $this->previous->DOM = $this->DOM; +// $this->previous->XPath = $this->XPath; + return $this->previous + ? $this->previous + : $this; + } + /** + * Enter description here... + * Normal use ->clone() . + * + * @return phpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery + * @access private + */ + public function _clone() { + $newStack = array(); + //pr(array('copy... ', $this->whois())); + //$this->dumpHistory('copy'); + $this->elementsBackup = $this->elements; + foreach($this->elements as $node) { + $newStack[] = $node->cloneNode(true); + } + $this->elements = $newStack; + return $this->newInstance(); + } + /** + * Enter description here... + * + * @return phpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery + */ + public function replaceWithPHP($code) { + return $this->replaceWith(phpQuery::php($code)); + } + /** + * Enter description here... + * + * @param String|phpQuery $content + * @link http://docs.jquery.com/Manipulation/replaceWith#content + * @return phpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery + */ + public function replaceWith($content) { + return $this->after($content)->remove(); + } + /** + * Enter description here... + * + * @param String $selector + * @return phpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery + * @todo this works ? + */ + public function replaceAll($selector) { + foreach(phpQuery::pq($selector, $this->getDocumentID()) as $node) + phpQuery::pq($node, $this->getDocumentID()) + ->after($this->_clone()) + ->remove(); + return $this; + } + /** + * Enter description here... + * + * @return phpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery + */ + public function remove($selector = null) { + $loop = $selector + ? $this->filter($selector)->elements + : $this->elements; + foreach($loop as $node) { + if (! $node->parentNode ) + continue; + if (isset($node->tagName)) + $this->debug("Removing '{$node->tagName}'"); + $node->parentNode->removeChild($node); + // Mutation event + $event = new DOMEvent(array( + 'target' => $node, + 'type' => 'DOMNodeRemoved' + )); + phpQueryEvents::trigger($this->getDocumentID(), + $event->type, array($event), $node + ); + } + return $this; + } + protected function markupEvents($newMarkup, $oldMarkup, $node) { + if ($node->tagName == 'textarea' && $newMarkup != $oldMarkup) { + $event = new DOMEvent(array( + 'target' => $node, + 'type' => 'change' + )); + phpQueryEvents::trigger($this->getDocumentID(), + $event->type, array($event), $node + ); + } + } + /** + * jQuey difference + * + * @param $markup + * @return unknown_type + * @TODO trigger change event for textarea + */ + public function markup($markup = null, $callback1 = null, $callback2 = null, $callback3 = null) { + $args = func_get_args(); + if ($this->documentWrapper->isXML) + return call_user_func_array(array($this, 'xml'), $args); + else + return call_user_func_array(array($this, 'html'), $args); + } + /** + * jQuey difference + * + * @param $markup + * @return unknown_type + */ + public function markupOuter($callback1 = null, $callback2 = null, $callback3 = null) { + $args = func_get_args(); + if ($this->documentWrapper->isXML) + return call_user_func_array(array($this, 'xmlOuter'), $args); + else + return call_user_func_array(array($this, 'htmlOuter'), $args); + } + /** + * Enter description here... + * + * @param unknown_type $html + * @return string|phpQuery|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery + * @TODO force html result + */ + public function html($html = null, $callback1 = null, $callback2 = null, $callback3 = null) { + if (isset($html)) { + // INSERT + $nodes = $this->documentWrapper->import($html); + $this->empty(); + foreach($this->stack(1) as $alreadyAdded => $node) { + // for now, limit events for textarea + if (($this->isXHTML() || $this->isHTML()) && $node->tagName == 'textarea') + $oldHtml = pq($node, $this->getDocumentID())->markup(); + foreach($nodes as $newNode) { + $node->appendChild($alreadyAdded + ? $newNode->cloneNode(true) + : $newNode + ); + } + // for now, limit events for textarea + if (($this->isXHTML() || $this->isHTML()) && $node->tagName == 'textarea') + $this->markupEvents($html, $oldHtml, $node); + } + return $this; + } else { + // FETCH + $return = $this->documentWrapper->markup($this->elements, true); + $args = func_get_args(); + foreach(array_slice($args, 1) as $callback) { + $return = phpQuery::callbackRun($callback, array($return)); + } + return $return; + } + } + /** + * @TODO force xml result + */ + public function xml($xml = null, $callback1 = null, $callback2 = null, $callback3 = null) { + $args = func_get_args(); + return call_user_func_array(array($this, 'html'), $args); + } + /** + * Enter description here... + * @TODO force html result + * + * @return String + */ + public function htmlOuter($callback1 = null, $callback2 = null, $callback3 = null) { + $markup = $this->documentWrapper->markup($this->elements); + // pass thou callbacks + $args = func_get_args(); + foreach($args as $callback) { + $markup = phpQuery::callbackRun($callback, array($markup)); + } + return $markup; + } + /** + * @TODO force xml result + */ + public function xmlOuter($callback1 = null, $callback2 = null, $callback3 = null) { + $args = func_get_args(); + return call_user_func_array(array($this, 'htmlOuter'), $args); + } + public function __toString() { + return $this->markupOuter(); + } + /** + * Just like html(), but returns markup with VALID (dangerous) PHP tags. + * + * @return phpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery + * @todo support returning markup with PHP tags when called without param + */ + public function php($code = null) { + return $this->markupPHP($code); + } + /** + * Enter description here... + * + * @param $code + * @return unknown_type + */ + public function markupPHP($code = null) { + return isset($code) + ? $this->markup(phpQuery::php($code)) + : phpQuery::markupToPHP($this->markup()); + } + /** + * Enter description here... + * + * @param $code + * @return unknown_type + */ + public function markupOuterPHP() { + return phpQuery::markupToPHP($this->markupOuter()); + } + /** + * Enter description here... + * + * @return phpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery + */ + public function children($selector = null) { + $stack = array(); + foreach($this->stack(1) as $node) { +// foreach($node->getElementsByTagName('*') as $newNode) { + foreach($node->childNodes as $newNode) { + if ($newNode->nodeType != 1) + continue; + if ($selector && ! $this->is($selector, $newNode)) + continue; + if ($this->elementsContainsNode($newNode, $stack)) + continue; + $stack[] = $newNode; + } + } + $this->elementsBackup = $this->elements; + $this->elements = $stack; + return $this->newInstance(); + } + /** + * Enter description here... + * + * @return phpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery + */ + public function ancestors($selector = null) { + return $this->children( $selector ); + } + /** + * Enter description here... + * + * @return phpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery + */ + public function append( $content) { + return $this->insert($content, __FUNCTION__); + } + /** + * Enter description here... + * + * @return phpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery + */ + public function appendPHP( $content) { + return $this->insert("
Hello, Person and person
+ * + * Result: + * [ ] + * + * @return phpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery + * @access private + */ + public function _empty() { + foreach($this->stack(1) as $node) { + // thx to 'dave at dgx dot cz' + $node->nodeValue = ''; + } + return $this; + } + /** + * Enter description here... + * + * @param array|string $callback Expects $node as first param, $index as second + * @param array $scope External variables passed to callback. Use compact('varName1', 'varName2'...) and extract($scope) + * @param array $arg1 Will ba passed as third and futher args to callback. + * @param array $arg2 Will ba passed as fourth and futher args to callback, and so on... + * @return phpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery + */ + public function each($callback, $param1 = null, $param2 = null, $param3 = null) { + $paramStructure = null; + if (func_num_args() > 1) { + $paramStructure = func_get_args(); + $paramStructure = array_slice($paramStructure, 1); + } + foreach($this->elements as $v) + phpQuery::callbackRun($callback, array($v), $paramStructure); + return $this; + } + /** + * Run callback on actual object. + * + * @return phpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery + */ + public function callback($callback, $param1 = null, $param2 = null, $param3 = null) { + $params = func_get_args(); + $params[0] = $this; + phpQuery::callbackRun($callback, $params); + return $this; + } + /** + * Enter description here... + * + * @return phpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery + * @todo add $scope and $args as in each() ??? + */ + public function map($callback, $param1 = null, $param2 = null, $param3 = null) { +// $stack = array(); +//// foreach($this->newInstance() as $node) { +// foreach($this->newInstance() as $node) { +// $result = call_user_func($callback, $node); +// if ($result) +// $stack[] = $result; +// } + $params = func_get_args(); + array_unshift($params, $this->elements); + return $this->newInstance( + call_user_func_array(array('phpQuery', 'map'), $params) +// phpQuery::map($this->elements, $callback) + ); + } + /** + * Enter description here... + * + * @param
- * $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", "
- * 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;
- }
- }
-
-}
diff --git a/phpQuery/phpQuery/bootstrap.example.php b/phpQuery/phpQuery/bootstrap.example.php
deleted file mode 100644
index 4fafe1a..0000000
--- a/phpQuery/phpQuery/bootstrap.example.php
+++ /dev/null
@@ -1,14 +0,0 @@
-
\ No newline at end of file
diff --git a/phpQuery/phpQuery/compat/mbstring.php b/phpQuery/phpQuery/compat/mbstring.php
deleted file mode 100644
index 409129e..0000000
--- a/phpQuery/phpQuery/compat/mbstring.php
+++ /dev/null
@@ -1,88 +0,0 @@
-document)
- $pq->find('*')->add($pq->document)
- ->trigger($type, $data);
- }
- } else {
- if (isset($data[0]) && $data[0] instanceof DOMEvent) {
- $event = $data[0];
- $event->relatedTarget = $event->target;
- $event->target = $node;
- $data = array_slice($data, 1);
- } else {
- $event = new DOMEvent(array(
- 'type' => $type,
- 'target' => $node,
- 'timeStamp' => time(),
- ));
- }
- $i = 0;
- while($node) {
- // TODO whois
- phpQuery::debug("Triggering ".($i?"bubbled ":'')."event '{$type}' on "
- ."node \n");//.phpQueryObject::whois($node)."\n");
- $event->currentTarget = $node;
- $eventNode = self::getNode($documentID, $node);
- if (isset($eventNode->eventHandlers)) {
- foreach($eventNode->eventHandlers as $eventType => $handlers) {
- $eventNamespace = null;
- if (strpos($type, '.') !== false)
- list($eventName, $eventNamespace) = explode('.', $eventType);
- else
- $eventName = $eventType;
- if ($name != $eventName)
- continue;
- if ($namespace && $eventNamespace && $namespace != $eventNamespace)
- continue;
- foreach($handlers as $handler) {
- phpQuery::debug("Calling event handler\n");
- $event->data = $handler['data']
- ? $handler['data']
- : null;
- $params = array_merge(array($event), $data);
- $return = phpQuery::callbackRun($handler['callback'], $params);
- if ($return === false) {
- $event->bubbles = false;
- }
- }
- }
- }
- // to bubble or not to bubble...
- if (! $event->bubbles)
- break;
- $node = $node->parentNode;
- $i++;
- }
- }
- }
- /**
- * Binds a handler to one or more events (like click) for each matched element.
- * Can also bind custom events.
- *
- * @param DOMNode|phpQueryObject|string $document
- * @param unknown_type $type
- * @param unknown_type $data Optional
- * @param unknown_type $callback
- *
- * @TODO support '!' (exclusive) events
- * @TODO support more than event in $type (space-separated)
- * @TODO support binding to global events
- */
- public static function add($document, $node, $type, $data, $callback = null) {
- phpQuery::debug("Binding '$type' event");
- $documentID = phpQuery::getDocumentID($document);
-// if (is_null($callback) && is_callable($data)) {
-// $callback = $data;
-// $data = null;
-// }
- $eventNode = self::getNode($documentID, $node);
- if (! $eventNode)
- $eventNode = self::setNode($documentID, $node);
- if (!isset($eventNode->eventHandlers[$type]))
- $eventNode->eventHandlers[$type] = array();
- $eventNode->eventHandlers[$type][] = array(
- 'callback' => $callback,
- 'data' => $data,
- );
- }
- /**
- * Enter description here...
- *
- * @param DOMNode|phpQueryObject|string $document
- * @param unknown_type $type
- * @param unknown_type $callback
- *
- * @TODO namespace events
- * @TODO support more than event in $type (space-separated)
- */
- public static function remove($document, $node, $type = null, $callback = null) {
- $documentID = phpQuery::getDocumentID($document);
- $eventNode = self::getNode($documentID, $node);
- if (is_object($eventNode) && isset($eventNode->eventHandlers[$type])) {
- if ($callback) {
- foreach($eventNode->eventHandlers[$type] as $k => $handler)
- if ($handler['callback'] == $callback)
- unset($eventNode->eventHandlers[$type][$k]);
- } else {
- unset($eventNode->eventHandlers[$type]);
- }
- }
- }
- protected static function getNode($documentID, $node) {
- foreach(phpQuery::$documents[$documentID]->eventsNodes as $eventNode) {
- if ($node->isSameNode($eventNode))
- return $eventNode;
- }
- }
- protected static function setNode($documentID, $node) {
- phpQuery::$documents[$documentID]->eventsNodes[] = $node;
- return phpQuery::$documents[$documentID]->eventsNodes[
- count(phpQuery::$documents[$documentID]->eventsNodes)-1
- ];
- }
- protected static function issetGlobal($documentID, $type) {
- return isset(phpQuery::$documents[$documentID])
- ? in_array($type, phpQuery::$documents[$documentID]->eventsGlobal)
- : false;
- }
-}
diff --git a/phpQuery/phpQuery/phpQueryObject.php b/phpQuery/phpQuery/phpQueryObject.php
deleted file mode 100644
index 146ddc8..0000000
--- a/phpQuery/phpQuery/phpQueryObject.php
+++ /dev/null
@@ -1,3180 +0,0 @@
-
- * @package phpQuery
- * @method phpQueryObject clone() clone()
- * @method phpQueryObject empty() empty()
- * @method phpQueryObject next() next($selector = null)
- * @method phpQueryObject prev() prev($selector = null)
- * @property Int $length
- */
-class phpQueryObject
- implements Iterator, Countable, ArrayAccess {
- public $documentID = null;
- /**
- * DOMDocument class.
- *
- * @var DOMDocument
- */
- public $document = null;
- public $charset = null;
- /**
- *
- * @var DOMDocumentWrapper
- */
- public $documentWrapper = null;
- /**
- * XPath interface.
- *
- * @var DOMXPath
- */
- public $xpath = null;
- /**
- * Stack of selected elements.
- * @TODO refactor to ->nodes
- * @var array
- */
- public $elements = array();
- /**
- * @access private
- */
- protected $elementsBackup = array();
- /**
- * @access private
- */
- protected $previous = null;
- /**
- * @access private
- * @TODO deprecate
- */
- protected $root = array();
- /**
- * Indicated if doument is just a fragment (no tag).
- *
- * Every document is realy a full document, so even documentFragments can
- * be queried against , but getDocument(id)->htmlOuter() will return
- * only contents of .
- *
- * @var bool
- */
- public $documentFragment = true;
- /**
- * Iterator interface helper
- * @access private
- */
- protected $elementsInterator = array();
- /**
- * Iterator interface helper
- * @access private
- */
- protected $valid = false;
- /**
- * Iterator interface helper
- * @access private
- */
- protected $current = null;
- /**
- * Enter description here...
- *
- * @return phpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery
- */
- public function __construct($documentID) {
-// if ($documentID instanceof self)
-// var_dump($documentID->getDocumentID());
- $id = $documentID instanceof self
- ? $documentID->getDocumentID()
- : $documentID;
-// var_dump($id);
- if (! isset(phpQuery::$documents[$id] )) {
-// var_dump(phpQuery::$documents);
- throw new Exception("Document with ID '{$id}' isn't loaded. Use phpQuery::newDocument(\$html) or phpQuery::newDocumentFile(\$file) first.");
- }
- $this->documentID = $id;
- $this->documentWrapper =& phpQuery::$documents[$id];
- $this->document =& $this->documentWrapper->document;
- $this->xpath =& $this->documentWrapper->xpath;
- $this->charset =& $this->documentWrapper->charset;
- $this->documentFragment =& $this->documentWrapper->isDocumentFragment;
- // TODO check $this->DOM->documentElement;
-// $this->root = $this->document->documentElement;
- $this->root =& $this->documentWrapper->root;
-// $this->toRoot();
- $this->elements = array($this->root);
- }
- /**
- *
- * @access private
- * @param $attr
- * @return unknown_type
- */
- public function __get($attr) {
- switch($attr) {
- // FIXME doesnt work at all ?
- case 'length':
- return $this->size();
- break;
- default:
- return $this->$attr;
- }
- }
- /**
- * Saves actual object to $var by reference.
- * Useful when need to break chain.
- * @param phpQueryObject $var
- * @return phpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery
- */
- public function toReference(&$var) {
- return $var = $this;
- }
- public function documentFragment($state = null) {
- if ($state) {
- phpQuery::$documents[$this->getDocumentID()]['documentFragment'] = $state;
- return $this;
- }
- return $this->documentFragment;
- }
- /**
- * @access private
- * @TODO documentWrapper
- */
- protected function isRoot( $node) {
-// return $node instanceof DOMDOCUMENT || $node->tagName == 'html';
- return $node instanceof DOMDOCUMENT
- || ($node instanceof DOMELEMENT && $node->tagName == 'html')
- || $this->root->isSameNode($node);
- }
- /**
- * @access private
- */
- protected function stackIsRoot() {
- return $this->size() == 1 && $this->isRoot($this->elements[0]);
- }
- /**
- * Enter description here...
- * NON JQUERY METHOD
- *
- * Watch out, it doesn't creates new instance, can be reverted with end().
- *
- * @return phpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery
- */
- public function toRoot() {
- $this->elements = array($this->root);
- return $this;
-// return $this->newInstance(array($this->root));
- }
- /**
- * Saves object's DocumentID to $var by reference.
- *
- * $myDocumentId;
- * phpQuery::newDocument('')
- * ->getDocumentIDRef($myDocumentId)
- * ->find('div')->...
- *
- *
- * @param unknown_type $domId
- * @see phpQuery::newDocument
- * @see phpQuery::newDocumentFile
- * @return phpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery
- */
- public function getDocumentIDRef(&$documentID) {
- $documentID = $this->getDocumentID();
- return $this;
- }
- /**
- * Returns object with stack set to document root.
- *
- * @return phpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery
- */
- public function getDocument() {
- return phpQuery::getDocument($this->getDocumentID());
- }
- /**
- *
- * @return DOMDocument
- */
- public function getDOMDocument() {
- return $this->document;
- }
- /**
- * Get object's Document ID.
- *
- * @return phpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery
- */
- public function getDocumentID() {
- return $this->documentID;
- }
- /**
- * Unloads whole document from memory.
- * CAUTION! None further operations will be possible on this document.
- * All objects refering to it will be useless.
- *
- * @return phpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery
- */
- public function unloadDocument() {
- phpQuery::unloadDocuments($this->getDocumentID());
- }
- public function isHTML() {
- return $this->documentWrapper->isHTML;
- }
- public function isXHTML() {
- return $this->documentWrapper->isXHTML;
- }
- public function isXML() {
- return $this->documentWrapper->isXML;
- }
- /**
- * Enter description here...
- *
- * @link http://docs.jquery.com/Ajax/serialize
- * @return string
- */
- public function serialize() {
- return phpQuery::param($this->serializeArray());
- }
- /**
- * Enter description here...
- *
- * @link http://docs.jquery.com/Ajax/serializeArray
- * @return array
- */
- public function serializeArray($submit = null) {
- $source = $this->filter('form, input, select, textarea')
- ->find('input, select, textarea')
- ->andSelf()
- ->not('form');
- $return = array();
-// $source->dumpDie();
- foreach($source as $input) {
- $input = phpQuery::pq($input);
- if ($input->is('[disabled]'))
- continue;
- if (!$input->is('[name]'))
- continue;
- if ($input->is('[type=checkbox]') && !$input->is('[checked]'))
- continue;
- // jquery diff
- if ($submit && $input->is('[type=submit]')) {
- if ($submit instanceof DOMELEMENT && ! $input->elements[0]->isSameNode($submit))
- continue;
- else if (is_string($submit) && $input->attr('name') != $submit)
- continue;
- }
- $return[] = array(
- 'name' => $input->attr('name'),
- 'value' => $input->val(),
- );
- }
- return $return;
- }
- /**
- * @access private
- */
- protected function debug($in) {
- if (! phpQuery::$debug )
- return;
- print(''); - print_r($in); - // file debug -// file_put_contents(dirname(__FILE__).'/phpQuery.log', print_r($in, true)."\n", FILE_APPEND); - // quite handy debug trace -// if ( is_array($in)) -// print_r(array_slice(debug_backtrace(), 3)); - print("\n"); - } - /** - * @access private - */ - protected function isRegexp($pattern) { - return in_array( - $pattern[ mb_strlen($pattern)-1 ], - array('^','*','$') - ); - } - /** - * Determines if $char is really a char. - * - * @param string $char - * @return bool - * @todo rewrite me to charcode range ! ;) - * @access private - */ - protected function isChar($char) { - return extension_loaded('mbstring') && phpQuery::$mbstringSupport - ? mb_eregi('\w', $char) - : preg_match('@\w@', $char); - } - /** - * @access private - */ - protected function parseSelector($query) { - // clean spaces - // TODO include this inside parsing ? - $query = trim( - preg_replace('@\s+@', ' ', - preg_replace('@\s*(>|\\+|~)\s*@', '\\1', $query) - ) - ); - $queries = array(array()); - if (! $query) - return $queries; - $return =& $queries[0]; - $specialChars = array('>',' '); -// $specialCharsMapping = array('/' => '>'); - $specialCharsMapping = array(); - $strlen = mb_strlen($query); - $classChars = array('.', '-'); - $pseudoChars = array('-'); - $tagChars = array('*', '|', '-'); - // split multibyte string - // http://code.google.com/p/phpquery/issues/detail?id=76 - $_query = array(); - for ($i=0; $i<$strlen; $i++) - $_query[] = mb_substr($query, $i, 1); - $query = $_query; - // it works, but i dont like it... - $i = 0; - while( $i < $strlen) { - $c = $query[$i]; - $tmp = ''; - // TAG - if ($this->isChar($c) || in_array($c, $tagChars)) { - while(isset($query[$i]) - && ($this->isChar($query[$i]) || in_array($query[$i], $tagChars))) { - $tmp .= $query[$i]; - $i++; - } - $return[] = $tmp; - // IDs - } else if ( $c == '#') { - $i++; - while( isset($query[$i]) && ($this->isChar($query[$i]) || $query[$i] == '-')) { - $tmp .= $query[$i]; - $i++; - } - $return[] = '#'.$tmp; - // SPECIAL CHARS - } else if (in_array($c, $specialChars)) { - $return[] = $c; - $i++; - // MAPPED SPECIAL MULTICHARS -// } else if ( $c.$query[$i+1] == '//') { -// $return[] = ' '; -// $i = $i+2; - // MAPPED SPECIAL CHARS - } else if ( isset($specialCharsMapping[$c])) { - $return[] = $specialCharsMapping[$c]; - $i++; - // COMMA - } else if ( $c == ',') { - $queries[] = array(); - $return =& $queries[ count($queries)-1 ]; - $i++; - while( isset($query[$i]) && $query[$i] == ' ') - $i++; - // CLASSES - } else if ($c == '.') { - while( isset($query[$i]) && ($this->isChar($query[$i]) || in_array($query[$i], $classChars))) { - $tmp .= $query[$i]; - $i++; - } - $return[] = $tmp; - // ~ General Sibling Selector - } else if ($c == '~') { - $spaceAllowed = true; - $tmp .= $query[$i++]; - while( isset($query[$i]) - && ($this->isChar($query[$i]) - || in_array($query[$i], $classChars) - || $query[$i] == '*' - || ($query[$i] == ' ' && $spaceAllowed) - )) { - if ($query[$i] != ' ') - $spaceAllowed = false; - $tmp .= $query[$i]; - $i++; - } - $return[] = $tmp; - // + Adjacent sibling selectors - } else if ($c == '+') { - $spaceAllowed = true; - $tmp .= $query[$i++]; - while( isset($query[$i]) - && ($this->isChar($query[$i]) - || in_array($query[$i], $classChars) - || $query[$i] == '*' - || ($spaceAllowed && $query[$i] == ' ') - )) { - if ($query[$i] != ' ') - $spaceAllowed = false; - $tmp .= $query[$i]; - $i++; - } - $return[] = $tmp; - // ATTRS - } else if ($c == '[') { - $stack = 1; - $tmp .= $c; - while( isset($query[++$i])) { - $tmp .= $query[$i]; - if ( $query[$i] == '[') { - $stack++; - } else if ( $query[$i] == ']') { - $stack--; - if (! $stack ) - break; - } - } - $return[] = $tmp; - $i++; - // PSEUDO CLASSES - } else if ($c == ':') { - $stack = 1; - $tmp .= $query[$i++]; - while( isset($query[$i]) && ($this->isChar($query[$i]) || in_array($query[$i], $pseudoChars))) { - $tmp .= $query[$i]; - $i++; - } - // with arguments ? - if ( isset($query[$i]) && $query[$i] == '(') { - $tmp .= $query[$i]; - $stack = 1; - while( isset($query[++$i])) { - $tmp .= $query[$i]; - if ( $query[$i] == '(') { - $stack++; - } else if ( $query[$i] == ')') { - $stack--; - if (! $stack ) - break; - } - } - $return[] = $tmp; - $i++; - } else { - $return[] = $tmp; - } - } else { - $i++; - } - } - foreach($queries as $k => $q) { - if (isset($q[0])) { - if (isset($q[0][0]) && $q[0][0] == ':') - array_unshift($queries[$k], '*'); - if ($q[0] != '>') - array_unshift($queries[$k], ' '); - } - } - return $queries; - } - /** - * Return matched DOM nodes. - * - * @param int $index - * @return array|DOMElement Single DOMElement or array of DOMElement. - */ - public function get($index = null, $callback1 = null, $callback2 = null, $callback3 = null) { - $return = isset($index) - ? (isset($this->elements[$index]) ? $this->elements[$index] : null) - : $this->elements; - // pass thou callbacks - $args = func_get_args(); - $args = array_slice($args, 1); - foreach($args as $callback) { - if (is_array($return)) - foreach($return as $k => $v) - $return[$k] = phpQuery::callbackRun($callback, array($v)); - else - $return = phpQuery::callbackRun($callback, array($return)); - } - return $return; - } - /** - * Return matched DOM nodes. - * jQuery difference. - * - * @param int $index - * @return array|string Returns string if $index != null - * @todo implement callbacks - * @todo return only arrays ? - * @todo maybe other name... - */ - public function getString($index = null, $callback1 = null, $callback2 = null, $callback3 = null) { - if ($index) - $return = $this->eq($index)->text(); - else { - $return = array(); - for($i = 0; $i < $this->size(); $i++) { - $return[] = $this->eq($i)->text(); - } - } - // pass thou callbacks - $args = func_get_args(); - $args = array_slice($args, 1); - foreach($args as $callback) { - $return = phpQuery::callbackRun($callback, array($return)); - } - return $return; - } - /** - * Return matched DOM nodes. - * jQuery difference. - * - * @param int $index - * @return array|string Returns string if $index != null - * @todo implement callbacks - * @todo return only arrays ? - * @todo maybe other name... - */ - public function getStrings($index = null, $callback1 = null, $callback2 = null, $callback3 = null) { - if ($index) - $return = $this->eq($index)->text(); - else { - $return = array(); - for($i = 0; $i < $this->size(); $i++) { - $return[] = $this->eq($i)->text(); - } - // pass thou callbacks - $args = func_get_args(); - $args = array_slice($args, 1); - } - foreach($args as $callback) { - if (is_array($return)) - foreach($return as $k => $v) - $return[$k] = phpQuery::callbackRun($callback, array($v)); - else - $return = phpQuery::callbackRun($callback, array($return)); - } - return $return; - } - /** - * Returns new instance of actual class. - * - * @param array $newStack Optional. Will replace old stack with new and move old one to history.c - */ - public function newInstance($newStack = null) { - $class = get_class($this); - // support inheritance by passing old object to overloaded constructor - $new = $class != 'phpQuery' - ? new $class($this, $this->getDocumentID()) - : new phpQueryObject($this->getDocumentID()); - $new->previous = $this; - if (is_null($newStack)) { - $new->elements = $this->elements; - if ($this->elementsBackup) - $this->elements = $this->elementsBackup; - } else if (is_string($newStack)) { - $new->elements = phpQuery::pq($newStack, $this->getDocumentID())->stack(); - } else { - $new->elements = $newStack; - } - return $new; - } - /** - * Enter description here... - * - * In the future, when PHP will support XLS 2.0, then we would do that this way: - * contains(tokenize(@class, '\s'), "something") - * @param unknown_type $class - * @param unknown_type $node - * @return boolean - * @access private - */ - protected function matchClasses($class, $node) { - // multi-class - if ( mb_strpos($class, '.', 1)) { - $classes = explode('.', substr($class, 1)); - $classesCount = count( $classes ); - $nodeClasses = explode(' ', $node->getAttribute('class') ); - $nodeClassesCount = count( $nodeClasses ); - if ( $classesCount > $nodeClassesCount ) - return false; - $diff = count( - array_diff( - $classes, - $nodeClasses - ) - ); - if (! $diff ) - return true; - // single-class - } else { - return in_array( - // strip leading dot from class name - substr($class, 1), - // get classes for element as array - explode(' ', $node->getAttribute('class') ) - ); - } - } - /** - * @access private - */ - protected function runQuery($XQuery, $selector = null, $compare = null) { - if ($compare && ! method_exists($this, $compare)) - return false; - $stack = array(); - if (! $this->elements) - $this->debug('Stack empty, skipping...'); -// var_dump($this->elements[0]->nodeType); - // element, document - foreach($this->stack(array(1, 9, 13)) as $k => $stackNode) { - $detachAfter = false; - // to work on detached nodes we need temporary place them somewhere - // thats because context xpath queries sucks ;] - $testNode = $stackNode; - while ($testNode) { - if (! $testNode->parentNode && ! $this->isRoot($testNode)) { - $this->root->appendChild($testNode); - $detachAfter = $testNode; - break; - } - $testNode = isset($testNode->parentNode) - ? $testNode->parentNode - : null; - } - // XXX tmp ? - $xpath = $this->documentWrapper->isXHTML - ? $this->getNodeXpath($stackNode, 'html') - : $this->getNodeXpath($stackNode); - // FIXME pseudoclasses-only query, support XML - $query = $XQuery == '//' && $xpath == '/html[1]' - ? '//*' - : $xpath.$XQuery; - $this->debug("XPATH: {$query}"); - // run query, get elements - $nodes = $this->xpath->query($query); - $this->debug("QUERY FETCHED"); - if (! $nodes->length ) - $this->debug('Nothing found'); - $debug = array(); - foreach($nodes as $node) { - $matched = false; - if ( $compare) { - phpQuery::$debug ? - $this->debug("Found: ".$this->whois( $node ).", comparing with {$compare}()") - : null; - $phpQueryDebug = phpQuery::$debug; - phpQuery::$debug = false; - // TODO ??? use phpQuery::callbackRun() - if (call_user_func_array(array($this, $compare), array($selector, $node))) - $matched = true; - phpQuery::$debug = $phpQueryDebug; - } else { - $matched = true; - } - if ( $matched) { - if (phpQuery::$debug) - $debug[] = $this->whois( $node ); - $stack[] = $node; - } - } - if (phpQuery::$debug) { - $this->debug("Matched ".count($debug).": ".implode(', ', $debug)); - } - if ($detachAfter) - $this->root->removeChild($detachAfter); - } - $this->elements = $stack; - } - /** - * Enter description here... - * - * @return phpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery - */ - public function find($selectors, $context = null, $noHistory = false) { - if (!$noHistory) - // backup last stack /for end()/ - $this->elementsBackup = $this->elements; - // allow to define context - // TODO combine code below with phpQuery::pq() context guessing code - // as generic function - if ($context) { - if (! is_array($context) && $context instanceof DOMELEMENT) - $this->elements = array($context); - else if (is_array($context)) { - $this->elements = array(); - foreach ($context as $c) - if ($c instanceof DOMELEMENT) - $this->elements[] = $c; - } else if ( $context instanceof self ) - $this->elements = $context->elements; - } - $queries = $this->parseSelector($selectors); - $this->debug(array('FIND', $selectors, $queries)); - $XQuery = ''; - // remember stack state because of multi-queries - $oldStack = $this->elements; - // here we will be keeping found elements - $stack = array(); - foreach($queries as $selector) { - $this->elements = $oldStack; - $delimiterBefore = false; - foreach($selector as $s) { - // TAG - $isTag = extension_loaded('mbstring') && phpQuery::$mbstringSupport - ? mb_ereg_match('^[\w|\||-]+$', $s) || $s == '*' - : preg_match('@^[\w|\||-]+$@', $s) || $s == '*'; - if ($isTag) { - if ($this->isXML()) { - // namespace support - if (mb_strpos($s, '|') !== false) { - $ns = $tag = null; - list($ns, $tag) = explode('|', $s); - $XQuery .= "$ns:$tag"; - } else if ($s == '*') { - $XQuery .= "*"; - } else { - $XQuery .= "*[local-name()='$s']"; - } - } else { - $XQuery .= $s; - } - // ID - } else if ($s[0] == '#') { - if ($delimiterBefore) - $XQuery .= '*'; - $XQuery .= "[@id='".substr($s, 1)."']"; - // ATTRIBUTES - } else if ($s[0] == '[') { - if ($delimiterBefore) - $XQuery .= '*'; - // strip side brackets - $attr = trim($s, ']['); - $execute = false; - // attr with specifed value - if (mb_strpos($s, '=')) { - $value = null; - list($attr, $value) = explode('=', $attr); - $value = trim($value, "'\""); - if ($this->isRegexp($attr)) { - // cut regexp character - $attr = substr($attr, 0, -1); - $execute = true; - $XQuery .= "[@{$attr}]"; - } else { - $XQuery .= "[@{$attr}='{$value}']"; - } - // attr without specified value - } else { - $XQuery .= "[@{$attr}]"; - } - if ($execute) { - $this->runQuery($XQuery, $s, 'is'); - $XQuery = ''; - if (! $this->length()) - break; - } - // CLASSES - } else if ($s[0] == '.') { - // TODO use return $this->find("./self::*[contains(concat(\" \",@class,\" \"), \" $class \")]"); - // thx wizDom ;) - if ($delimiterBefore) - $XQuery .= '*'; - $XQuery .= '[@class]'; - $this->runQuery($XQuery, $s, 'matchClasses'); - $XQuery = ''; - if (! $this->length() ) - break; - // ~ General Sibling Selector - } else if ($s[0] == '~') { - $this->runQuery($XQuery); - $XQuery = ''; - $this->elements = $this - ->siblings( - substr($s, 1) - )->elements; - if (! $this->length() ) - break; - // + Adjacent sibling selectors - } else if ($s[0] == '+') { - // TODO /following-sibling:: - $this->runQuery($XQuery); - $XQuery = ''; - $subSelector = substr($s, 1); - $subElements = $this->elements; - $this->elements = array(); - foreach($subElements as $node) { - // search first DOMElement sibling - $test = $node->nextSibling; - while($test && ! ($test instanceof DOMELEMENT)) - $test = $test->nextSibling; - if ($test && $this->is($subSelector, $test)) - $this->elements[] = $test; - } - if (! $this->length() ) - break; - // PSEUDO CLASSES - } else if ($s[0] == ':') { - // TODO optimization for :first :last - if ($XQuery) { - $this->runQuery($XQuery); - $XQuery = ''; - } - if (! $this->length()) - break; - $this->pseudoClasses($s); - if (! $this->length()) - break; - // DIRECT DESCENDANDS - } else if ($s == '>') { - $XQuery .= '/'; - $delimiterBefore = 2; - // ALL DESCENDANDS - } else if ($s == ' ') { - $XQuery .= '//'; - $delimiterBefore = 2; - // ERRORS - } else { - phpQuery::debug("Unrecognized token '$s'"); - } - $delimiterBefore = $delimiterBefore === 2; - } - // run query if any - if ($XQuery && $XQuery != '//') { - $this->runQuery($XQuery); - $XQuery = ''; - } - foreach($this->elements as $node) - if (! $this->elementsContainsNode($node, $stack)) - $stack[] = $node; - } - $this->elements = $stack; - return $this->newInstance(); - } - /** - * @todo create API for classes with pseudoselectors - * @access private - */ - protected function pseudoClasses($class) { - // TODO clean args parsing ? - $class = ltrim($class, ':'); - $haveArgs = mb_strpos($class, '('); - if ($haveArgs !== false) { - $args = substr($class, $haveArgs+1, -1); - $class = substr($class, 0, $haveArgs); - } - switch($class) { - case 'even': - case 'odd': - $stack = array(); - foreach($this->elements as $i => $node) { - if ($class == 'even' && ($i%2) == 0) - $stack[] = $node; - else if ( $class == 'odd' && $i % 2 ) - $stack[] = $node; - } - $this->elements = $stack; - break; - case 'eq': - $k = intval($args); - $this->elements = isset( $this->elements[$k] ) - ? array( $this->elements[$k] ) - : array(); - break; - case 'gt': - $this->elements = array_slice($this->elements, $args+1); - break; - case 'lt': - $this->elements = array_slice($this->elements, 0, $args+1); - break; - case 'first': - if (isset($this->elements[0])) - $this->elements = array($this->elements[0]); - break; - case 'last': - if ($this->elements) - $this->elements = array($this->elements[count($this->elements)-1]); - break; - /*case 'parent': - $stack = array(); - foreach($this->elements as $node) { - if ( $node->childNodes->length ) - $stack[] = $node; - } - $this->elements = $stack; - break;*/ - case 'contains': - $text = trim($args, "\"'"); - $stack = array(); - foreach($this->elements as $node) { - if (mb_stripos($node->textContent, $text) === false) - continue; - $stack[] = $node; - } - $this->elements = $stack; - break; - case 'not': - $selector = self::unQuote($args); - $this->elements = $this->not($selector)->stack(); - break; - case 'slice': - // TODO jQuery difference ? - $args = explode(',', - str_replace(', ', ',', trim($args, "\"'")) - ); - $start = $args[0]; - $end = isset($args[1]) - ? $args[1] - : null; - if ($end > 0) - $end = $end-$start; - $this->elements = array_slice($this->elements, $start, $end); - break; - case 'has': - $selector = trim($args, "\"'"); - $stack = array(); - foreach($this->stack(1) as $el) { - if ($this->find($selector, $el, true)->length) - $stack[] = $el; - } - $this->elements = $stack; - break; - case 'submit': - case 'reset': - $this->elements = phpQuery::merge( - $this->map(array($this, 'is'), - "input[type=$class]", new CallbackParam() - ), - $this->map(array($this, 'is'), - "button[type=$class]", new CallbackParam() - ) - ); - break; -// $stack = array(); -// foreach($this->elements as $node) -// if ($node->is('input[type=submit]') || $node->is('button[type=submit]')) -// $stack[] = $el; -// $this->elements = $stack; - case 'input': - $this->elements = $this->map( - array($this, 'is'), - 'input', new CallbackParam() - )->elements; - break; - case 'password': - case 'checkbox': - case 'radio': - case 'hidden': - case 'image': - case 'file': - $this->elements = $this->map( - array($this, 'is'), - "input[type=$class]", new CallbackParam() - )->elements; - break; - case 'parent': - $this->elements = $this->map( - create_function('$node', ' - return $node instanceof DOMELEMENT && $node->childNodes->length - ? $node : null;') - )->elements; - break; - case 'empty': - $this->elements = $this->map( - create_function('$node', ' - return $node instanceof DOMELEMENT && $node->childNodes->length - ? null : $node;') - )->elements; - break; - case 'disabled': - case 'selected': - case 'checked': - $this->elements = $this->map( - array($this, 'is'), - "[$class]", new CallbackParam() - )->elements; - break; - case 'enabled': - $this->elements = $this->map( - create_function('$node', ' - return pq($node)->not(":disabled") ? $node : null;') - )->elements; - break; - case 'header': - $this->elements = $this->map( - create_function('$node', - '$isHeader = isset($node->tagName) && in_array($node->tagName, array( - "h1", "h2", "h3", "h4", "h5", "h6", "h7" - )); - return $isHeader - ? $node - : null;') - )->elements; -// $this->elements = $this->map( -// create_function('$node', '$node = pq($node); -// return $node->is("h1") -// || $node->is("h2") -// || $node->is("h3") -// || $node->is("h4") -// || $node->is("h5") -// || $node->is("h6") -// || $node->is("h7") -// ? $node -// : null;') -// )->elements; - break; - case 'only-child': - $this->elements = $this->map( - create_function('$node', - 'return pq($node)->siblings()->size() == 0 ? $node : null;') - )->elements; - break; - case 'first-child': - $this->elements = $this->map( - create_function('$node', 'return pq($node)->prevAll()->size() == 0 ? $node : null;') - )->elements; - break; - case 'last-child': - $this->elements = $this->map( - create_function('$node', 'return pq($node)->nextAll()->size() == 0 ? $node : null;') - )->elements; - break; - case 'nth-child': - $param = trim($args, "\"'"); - if (! $param) - break; - // nth-child(n+b) to nth-child(1n+b) - if ($param{0} == 'n') - $param = '1'.$param; - // :nth-child(index/even/odd/equation) - if ($param == 'even' || $param == 'odd') - $mapped = $this->map( - create_function('$node, $param', - '$index = pq($node)->prevAll()->size()+1; - if ($param == "even" && ($index%2) == 0) - return $node; - else if ($param == "odd" && $index%2 == 1) - return $node; - else - return null;'), - new CallbackParam(), $param - ); - else if (mb_strlen($param) > 1 && $param{1} == 'n') - // 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; - if ($a > 0) { - return ($index-$b)%$a == 0 - ? $node - : null; - phpQuery::debug($a."*".floor($index/$a)."+$b-1 == ".($a*floor($index/$a)+$b-1)." ?= $prevs"); - return $a*floor($index/$a)+$b-1 == $prevs - ? $node - : null; - } else if ($a == 0) - return $index == $b - ? $node - : null; - else - // negative value - return $index <= $b - ? $node - : null; -// if (! $b) -// return $index%$a == 0 -// ? $node -// : null; -// else -// return ($index-$b)%$a == 0 -// ? $node -// : null; - '), - new CallbackParam(), $param - ); - else - // index - $mapped = $this->map( - create_function('$node, $index', - '$prevs = pq($node)->prevAll()->size(); - if ($prevs && $prevs == $index-1) - return $node; - else if (! $prevs && $index == 1) - return $node; - else - return null;'), - new CallbackParam(), $param - ); - $this->elements = $mapped->elements; - break; - default: - $this->debug("Unknown pseudoclass '{$class}', skipping..."); - } - } - /** - * @access private - */ - protected function __pseudoClassParam($paramsString) { - // TODO; - } - /** - * Enter description here... - * - * @return phpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery - */ - public function is($selector, $nodes = null) { - phpQuery::debug(array("Is:", $selector)); - if (! $selector) - return false; - $oldStack = $this->elements; - $returnArray = false; - if ($nodes && is_array($nodes)) { - $this->elements = $nodes; - } else if ($nodes) - $this->elements = array($nodes); - $this->filter($selector, true); - $stack = $this->elements; - $this->elements = $oldStack; - if ($nodes) - return $stack ? $stack : null; - return (bool)count($stack); - } - /** - * Enter description here... - * jQuery difference. - * - * Callback: - * - $index int - * - $node DOMNode - * - * @return phpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery - * @link http://docs.jquery.com/Traversing/filter - */ - public function filterCallback($callback, $_skipHistory = false) { - if (! $_skipHistory) { - $this->elementsBackup = $this->elements; - $this->debug("Filtering by callback"); - } - $newStack = array(); - foreach($this->elements as $index => $node) { - $result = phpQuery::callbackRun($callback, array($index, $node)); - if (is_null($result) || (! is_null($result) && $result)) - $newStack[] = $node; - } - $this->elements = $newStack; - return $_skipHistory - ? $this - : $this->newInstance(); - } - /** - * Enter description here... - * - * @return phpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery - * @link http://docs.jquery.com/Traversing/filter - */ - public function filter($selectors, $_skipHistory = false) { - if ($selectors instanceof Callback OR $selectors instanceof Closure) - return $this->filterCallback($selectors, $_skipHistory); - if (! $_skipHistory) - $this->elementsBackup = $this->elements; - $notSimpleSelector = array(' ', '>', '~', '+', '/'); - if (! is_array($selectors)) - $selectors = $this->parseSelector($selectors); - if (! $_skipHistory) - $this->debug(array("Filtering:", $selectors)); - $finalStack = array(); - foreach($selectors as $selector) { - $stack = array(); - if (! $selector) - break; - // avoid first space or / - if (in_array($selector[0], $notSimpleSelector)) - $selector = array_slice($selector, 1); - // PER NODE selector chunks - foreach($this->stack() as $node) { - $break = false; - foreach($selector as $s) { - if (!($node instanceof DOMELEMENT)) { - // all besides DOMElement - if ( $s[0] == '[') { - $attr = trim($s, '[]'); - if ( mb_strpos($attr, '=')) { - list( $attr, $val ) = explode('=', $attr); - if ($attr == 'nodeType' && $node->nodeType != $val) - $break = true; - } - } else - $break = true; - } else { - // DOMElement only - // ID - if ( $s[0] == '#') { - if ( $node->getAttribute('id') != substr($s, 1) ) - $break = true; - // CLASSES - } else if ( $s[0] == '.') { - if (! $this->matchClasses( $s, $node ) ) - $break = true; - // ATTRS - } else if ( $s[0] == '[') { - // strip side brackets - $attr = trim($s, '[]'); - if (mb_strpos($attr, '=')) { - list($attr, $val) = explode('=', $attr); - $val = self::unQuote($val); - if ($attr == 'nodeType') { - if ($val != $node->nodeType) - $break = true; - } else if ($this->isRegexp($attr)) { - $val = extension_loaded('mbstring') && phpQuery::$mbstringSupport - ? quotemeta(trim($val, '"\'')) - : preg_quote(trim($val, '"\''), '@'); - // switch last character - switch( substr($attr, -1)) { - // quotemeta used insted of preg_quote - // http://code.google.com/p/phpquery/issues/detail?id=76 - case '^': - $pattern = '^'.$val; - break; - case '*': - $pattern = '.*'.$val.'.*'; - break; - case '$': - $pattern = '.*'.$val.'$'; - break; - } - // cut last character - $attr = substr($attr, 0, -1); - $isMatch = extension_loaded('mbstring') && phpQuery::$mbstringSupport - ? mb_ereg_match($pattern, $node->getAttribute($attr)) - : preg_match("@{$pattern}@", $node->getAttribute($attr)); - if (! $isMatch) - $break = true; - } else if ($node->getAttribute($attr) != $val) - $break = true; - } else if (! $node->hasAttribute($attr)) - $break = true; - // PSEUDO CLASSES - } else if ( $s[0] == ':') { - // skip - // TAG - } else if (trim($s)) { - if ($s != '*') { - // TODO namespaces - if (isset($node->tagName)) { - if ($node->tagName != $s) - $break = true; - } else if ($s == 'html' && ! $this->isRoot($node)) - $break = true; - } - // AVOID NON-SIMPLE SELECTORS - } else if (in_array($s, $notSimpleSelector)) { - $break = true; - $this->debug(array('Skipping non simple selector', $selector)); - } - } - if ($break) - break; - } - // if element passed all chunks of selector - add it to new stack - if (! $break ) - $stack[] = $node; - } - $tmpStack = $this->elements; - $this->elements = $stack; - // PER ALL NODES selector chunks - foreach($selector as $s) - // PSEUDO CLASSES - if ($s[0] == ':') - $this->pseudoClasses($s); - foreach($this->elements as $node) - // XXX it should be merged without duplicates - // but jQuery doesnt do that - $finalStack[] = $node; - $this->elements = $tmpStack; - } - $this->elements = $finalStack; - if ($_skipHistory) { - return $this; - } else { - $this->debug("Stack length after filter(): ".count($finalStack)); - return $this->newInstance(); - } - } - /** - * - * @param $value - * @return unknown_type - * @TODO implement in all methods using passed parameters - */ - protected static function unQuote($value) { - return $value[0] == '\'' || $value[0] == '"' - ? substr($value, 1, -1) - : $value; - } - /** - * Enter description here... - * - * @link http://docs.jquery.com/Ajax/load - * @return phpQuery|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery - * @todo Support $selector - */ - public function load($url, $data = null, $callback = null) { - if ($data && ! is_array($data)) { - $callback = $data; - $data = null; - } - if (mb_strpos($url, ' ') !== false) { - $matches = null; - if (extension_loaded('mbstring') && phpQuery::$mbstringSupport) - mb_ereg('^([^ ]+) (.*)$', $url, $matches); - else - preg_match('^([^ ]+) (.*)$', $url, $matches); - $url = $matches[1]; - $selector = $matches[2]; - // FIXME this sucks, pass as callback param - $this->_loadSelector = $selector; - } - $ajax = array( - 'url' => $url, - 'type' => $data ? 'POST' : 'GET', - 'data' => $data, - 'complete' => $callback, - 'success' => array($this, '__loadSuccess') - ); - phpQuery::ajax($ajax); - return $this; - } - /** - * @access private - * @param $html - * @return unknown_type - */ - public function __loadSuccess($html) { - if ($this->_loadSelector) { - $html = phpQuery::newDocument($html)->find($this->_loadSelector); - unset($this->_loadSelector); - } - foreach($this->stack(1) as $node) { - phpQuery::pq($node, $this->getDocumentID()) - ->markup($html); - } - } - /** - * Enter description here... - * - * @return phpQuery|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery - * @todo - */ - public function css() { - // TODO - return $this; - } - /** - * @todo - * - */ - public function show(){ - // TODO - return $this; - } - /** - * @todo - * - */ - public function hide(){ - // TODO - return $this; - } - /** - * Trigger a type of event on every matched element. - * - * @param unknown_type $type - * @param unknown_type $data - * @return phpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery - * @TODO support more than event in $type (space-separated) - */ - public function trigger($type, $data = array()) { - foreach($this->elements as $node) - phpQueryEvents::trigger($this->getDocumentID(), $type, $data, $node); - return $this; - } - /** - * This particular method triggers all bound event handlers on an element (for a specific event type) WITHOUT executing the browsers default actions. - * - * @param unknown_type $type - * @param unknown_type $data - * @return phpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery - * @TODO - */ - public function triggerHandler($type, $data = array()) { - // TODO; - } - /** - * Binds a handler to one or more events (like click) for each matched element. - * Can also bind custom events. - * - * @param unknown_type $type - * @param unknown_type $data Optional - * @param unknown_type $callback - * @return phpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery - * @TODO support '!' (exclusive) events - * @TODO support more than event in $type (space-separated) - */ - public function bind($type, $data, $callback = null) { - // TODO check if $data is callable, not using is_callable - if (! isset($callback)) { - $callback = $data; - $data = null; - } - foreach($this->elements as $node) - phpQueryEvents::add($this->getDocumentID(), $node, $type, $data, $callback); - return $this; - } - /** - * Enter description here... - * - * @param unknown_type $type - * @param unknown_type $callback - * @return unknown - * @TODO namespace events - * @TODO support more than event in $type (space-separated) - */ - public function unbind($type = null, $callback = null) { - foreach($this->elements as $node) - phpQueryEvents::remove($this->getDocumentID(), $node, $type, $callback); - return $this; - } - /** - * Enter description here... - * - * @return phpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery - */ - public function change($callback = null) { - if ($callback) - return $this->bind('change', $callback); - return $this->trigger('change'); - } - /** - * Enter description here... - * - * @return phpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery - */ - public function submit($callback = null) { - if ($callback) - return $this->bind('submit', $callback); - return $this->trigger('submit'); - } - /** - * Enter description here... - * - * @return phpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery - */ - public function click($callback = null) { - if ($callback) - return $this->bind('click', $callback); - return $this->trigger('click'); - } - /** - * Enter description here... - * - * @param String|phpQuery - * @return phpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery - */ - public function wrapAllOld($wrapper) { - $wrapper = pq($wrapper)->_clone(); - if (! $wrapper->length() || ! $this->length() ) - return $this; - $wrapper->insertBefore($this->elements[0]); - $deepest = $wrapper->elements[0]; - while($deepest->firstChild && $deepest->firstChild instanceof DOMELEMENT) - $deepest = $deepest->firstChild; - pq($deepest)->append($this); - return $this; - } - /** - * Enter description here... - * - * TODO testme... - * @param String|phpQuery - * @return phpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery - */ - public function wrapAll($wrapper) { - if (! $this->length()) - return $this; - return phpQuery::pq($wrapper, $this->getDocumentID()) - ->clone() - ->insertBefore($this->get(0)) - ->map(array($this, '___wrapAllCallback')) - ->append($this); - } - /** - * - * @param $node - * @return unknown_type - * @access private - */ - public function ___wrapAllCallback($node) { - $deepest = $node; - while($deepest->firstChild && $deepest->firstChild instanceof DOMELEMENT) - $deepest = $deepest->firstChild; - return $deepest; - } - /** - * Enter description here... - * NON JQUERY METHOD - * - * @param String|phpQuery - * @return phpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery - */ - public function wrapAllPHP($codeBefore, $codeAfter) { - return $this - ->slice(0, 1) - ->beforePHP($codeBefore) - ->end() - ->slice(-1) - ->afterPHP($codeAfter) - ->end(); - } - /** - * Enter description here... - * - * @param String|phpQuery - * @return phpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery - */ - public function wrap($wrapper) { - foreach($this->stack() as $node) - phpQuery::pq($node, $this->getDocumentID())->wrapAll($wrapper); - return $this; - } - /** - * Enter description here... - * - * @param String|phpQuery - * @return phpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery - */ - public function wrapPHP($codeBefore, $codeAfter) { - foreach($this->stack() as $node) - phpQuery::pq($node, $this->getDocumentID())->wrapAllPHP($codeBefore, $codeAfter); - return $this; - } - /** - * Enter description here... - * - * @param String|phpQuery - * @return phpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery - */ - public function wrapInner($wrapper) { - foreach($this->stack() as $node) - phpQuery::pq($node, $this->getDocumentID())->contents()->wrapAll($wrapper); - return $this; - } - /** - * Enter description here... - * - * @param String|phpQuery - * @return phpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery - */ - public function wrapInnerPHP($codeBefore, $codeAfter) { - foreach($this->stack(1) as $node) - phpQuery::pq($node, $this->getDocumentID())->contents() - ->wrapAllPHP($codeBefore, $codeAfter); - return $this; - } - /** - * Enter description here... - * - * @return phpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery - * @testme Support for text nodes - */ - public function contents() { - $stack = array(); - foreach($this->stack(1) as $el) { - // FIXME (fixed) http://code.google.com/p/phpquery/issues/detail?id=56 -// if (! isset($el->childNodes)) -// continue; - foreach($el->childNodes as $node) { - $stack[] = $node; - } - } - return $this->newInstance($stack); - } - /** - * Enter description here... - * - * jQuery difference. - * - * @return phpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery - */ - public function contentsUnwrap() { - foreach($this->stack(1) as $node) { - if (! $node->parentNode ) - continue; - $childNodes = array(); - // any modification in DOM tree breaks childNodes iteration, so cache them first - foreach($node->childNodes as $chNode ) - $childNodes[] = $chNode; - foreach($childNodes as $chNode ) -// $node->parentNode->appendChild($chNode); - $node->parentNode->insertBefore($chNode, $node); - $node->parentNode->removeChild($node); - } - return $this; - } - /** - * Enter description here... - * - * jQuery difference. - */ - public function switchWith($markup) { - $markup = pq($markup, $this->getDocumentID()); - $content = null; - foreach($this->stack(1) as $node) { - pq($node) - ->contents()->toReference($content)->end() - ->replaceWith($markup->clone()->append($content)); - } - return $this; - } - /** - * Enter description here... - * - * @return phpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery - */ - public function eq($num) { - $oldStack = $this->elements; - $this->elementsBackup = $this->elements; - $this->elements = array(); - if ( isset($oldStack[$num]) ) - $this->elements[] = $oldStack[$num]; - return $this->newInstance(); - } - /** - * Enter description here... - * - * @return phpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery - */ - public function size() { - return count($this->elements); - } - /** - * Enter description here... - * - * @return phpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery - * @deprecated Use length as attribute - */ - public function length() { - return $this->size(); - } - public function count() { - return $this->size(); - } - /** - * Enter description here... - * - * @return phpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery - * @todo $level - */ - public function end($level = 1) { -// $this->elements = array_pop( $this->history ); -// return $this; -// $this->previous->DOM = $this->DOM; -// $this->previous->XPath = $this->XPath; - return $this->previous - ? $this->previous - : $this; - } - /** - * Enter description here... - * Normal use ->clone() . - * - * @return phpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery - * @access private - */ - public function _clone() { - $newStack = array(); - //pr(array('copy... ', $this->whois())); - //$this->dumpHistory('copy'); - $this->elementsBackup = $this->elements; - foreach($this->elements as $node) { - $newStack[] = $node->cloneNode(true); - } - $this->elements = $newStack; - return $this->newInstance(); - } - /** - * Enter description here... - * - * @return phpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery - */ - public function replaceWithPHP($code) { - return $this->replaceWith(phpQuery::php($code)); - } - /** - * Enter description here... - * - * @param String|phpQuery $content - * @link http://docs.jquery.com/Manipulation/replaceWith#content - * @return phpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery - */ - public function replaceWith($content) { - return $this->after($content)->remove(); - } - /** - * Enter description here... - * - * @param String $selector - * @return phpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery - * @todo this works ? - */ - public function replaceAll($selector) { - foreach(phpQuery::pq($selector, $this->getDocumentID()) as $node) - phpQuery::pq($node, $this->getDocumentID()) - ->after($this->_clone()) - ->remove(); - return $this; - } - /** - * Enter description here... - * - * @return phpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery - */ - public function remove($selector = null) { - $loop = $selector - ? $this->filter($selector)->elements - : $this->elements; - foreach($loop as $node) { - if (! $node->parentNode ) - continue; - if (isset($node->tagName)) - $this->debug("Removing '{$node->tagName}'"); - $node->parentNode->removeChild($node); - // Mutation event - $event = new DOMEvent(array( - 'target' => $node, - 'type' => 'DOMNodeRemoved' - )); - phpQueryEvents::trigger($this->getDocumentID(), - $event->type, array($event), $node - ); - } - return $this; - } - protected function markupEvents($newMarkup, $oldMarkup, $node) { - if ($node->tagName == 'textarea' && $newMarkup != $oldMarkup) { - $event = new DOMEvent(array( - 'target' => $node, - 'type' => 'change' - )); - phpQueryEvents::trigger($this->getDocumentID(), - $event->type, array($event), $node - ); - } - } - /** - * jQuey difference - * - * @param $markup - * @return unknown_type - * @TODO trigger change event for textarea - */ - public function markup($markup = null, $callback1 = null, $callback2 = null, $callback3 = null) { - $args = func_get_args(); - if ($this->documentWrapper->isXML) - return call_user_func_array(array($this, 'xml'), $args); - else - return call_user_func_array(array($this, 'html'), $args); - } - /** - * jQuey difference - * - * @param $markup - * @return unknown_type - */ - public function markupOuter($callback1 = null, $callback2 = null, $callback3 = null) { - $args = func_get_args(); - if ($this->documentWrapper->isXML) - return call_user_func_array(array($this, 'xmlOuter'), $args); - else - return call_user_func_array(array($this, 'htmlOuter'), $args); - } - /** - * Enter description here... - * - * @param unknown_type $html - * @return string|phpQuery|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery - * @TODO force html result - */ - public function html($html = null, $callback1 = null, $callback2 = null, $callback3 = null) { - if (isset($html)) { - // INSERT - $nodes = $this->documentWrapper->import($html); - $this->empty(); - foreach($this->stack(1) as $alreadyAdded => $node) { - // for now, limit events for textarea - if (($this->isXHTML() || $this->isHTML()) && $node->tagName == 'textarea') - $oldHtml = pq($node, $this->getDocumentID())->markup(); - foreach($nodes as $newNode) { - $node->appendChild($alreadyAdded - ? $newNode->cloneNode(true) - : $newNode - ); - } - // for now, limit events for textarea - if (($this->isXHTML() || $this->isHTML()) && $node->tagName == 'textarea') - $this->markupEvents($html, $oldHtml, $node); - } - return $this; - } else { - // FETCH - $return = $this->documentWrapper->markup($this->elements, true); - $args = func_get_args(); - foreach(array_slice($args, 1) as $callback) { - $return = phpQuery::callbackRun($callback, array($return)); - } - return $return; - } - } - /** - * @TODO force xml result - */ - public function xml($xml = null, $callback1 = null, $callback2 = null, $callback3 = null) { - $args = func_get_args(); - return call_user_func_array(array($this, 'html'), $args); - } - /** - * Enter description here... - * @TODO force html result - * - * @return String - */ - public function htmlOuter($callback1 = null, $callback2 = null, $callback3 = null) { - $markup = $this->documentWrapper->markup($this->elements); - // pass thou callbacks - $args = func_get_args(); - foreach($args as $callback) { - $markup = phpQuery::callbackRun($callback, array($markup)); - } - return $markup; - } - /** - * @TODO force xml result - */ - public function xmlOuter($callback1 = null, $callback2 = null, $callback3 = null) { - $args = func_get_args(); - return call_user_func_array(array($this, 'htmlOuter'), $args); - } - public function __toString() { - return $this->markupOuter(); - } - /** - * Just like html(), but returns markup with VALID (dangerous) PHP tags. - * - * @return phpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery - * @todo support returning markup with PHP tags when called without param - */ - public function php($code = null) { - return $this->markupPHP($code); - } - /** - * Enter description here... - * - * @param $code - * @return unknown_type - */ - public function markupPHP($code = null) { - return isset($code) - ? $this->markup(phpQuery::php($code)) - : phpQuery::markupToPHP($this->markup()); - } - /** - * Enter description here... - * - * @param $code - * @return unknown_type - */ - public function markupOuterPHP() { - return phpQuery::markupToPHP($this->markupOuter()); - } - /** - * Enter description here... - * - * @return phpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery - */ - public function children($selector = null) { - $stack = array(); - foreach($this->stack(1) as $node) { -// foreach($node->getElementsByTagName('*') as $newNode) { - foreach($node->childNodes as $newNode) { - if ($newNode->nodeType != 1) - continue; - if ($selector && ! $this->is($selector, $newNode)) - continue; - if ($this->elementsContainsNode($newNode, $stack)) - continue; - $stack[] = $newNode; - } - } - $this->elementsBackup = $this->elements; - $this->elements = $stack; - return $this->newInstance(); - } - /** - * Enter description here... - * - * @return phpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery - */ - public function ancestors($selector = null) { - return $this->children( $selector ); - } - /** - * Enter description here... - * - * @return phpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery - */ - public function append( $content) { - return $this->insert($content, __FUNCTION__); - } - /** - * Enter description here... - * - * @return phpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery - */ - public function appendPHP( $content) { - return $this->insert("
Hello, Person and person
- * - * Result: - * [ ] - * - * @return phpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery - * @access private - */ - public function _empty() { - foreach($this->stack(1) as $node) { - // thx to 'dave at dgx dot cz' - $node->nodeValue = ''; - } - return $this; - } - /** - * Enter description here... - * - * @param array|string $callback Expects $node as first param, $index as second - * @param array $scope External variables passed to callback. Use compact('varName1', 'varName2'...) and extract($scope) - * @param array $arg1 Will ba passed as third and futher args to callback. - * @param array $arg2 Will ba passed as fourth and futher args to callback, and so on... - * @return phpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery - */ - public function each($callback, $param1 = null, $param2 = null, $param3 = null) { - $paramStructure = null; - if (func_num_args() > 1) { - $paramStructure = func_get_args(); - $paramStructure = array_slice($paramStructure, 1); - } - foreach($this->elements as $v) - phpQuery::callbackRun($callback, array($v), $paramStructure); - return $this; - } - /** - * Run callback on actual object. - * - * @return phpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery - */ - public function callback($callback, $param1 = null, $param2 = null, $param3 = null) { - $params = func_get_args(); - $params[0] = $this; - phpQuery::callbackRun($callback, $params); - return $this; - } - /** - * Enter description here... - * - * @return phpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery - * @todo add $scope and $args as in each() ??? - */ - public function map($callback, $param1 = null, $param2 = null, $param3 = null) { -// $stack = array(); -//// foreach($this->newInstance() as $node) { -// foreach($this->newInstance() as $node) { -// $result = call_user_func($callback, $node); -// if ($result) -// $stack[] = $result; -// } - $params = func_get_args(); - array_unshift($params, $this->elements); - return $this->newInstance( - call_user_func_array(array('phpQuery', 'map'), $params) -// phpQuery::map($this->elements, $callback) - ); - } - /** - * Enter description here... - * - * @param