/** * Multi-purpose function. * Use pq() as shortcut. * * In below examples, $pq is any result of pq(); function. * * 1. Import markup into existing document (without any attaching): * - Import into selected document: * pq('<div/>') // DOESNT accept text nodes at beginning of input string ! * - Import into document with ID from $pq->getDocumentID(): * pq('<div/>', $pq->getDocumentID()) * - Import into same document as DOMNode belongs to: * pq('<div/>', DOMNode) * - Import into document from phpQuery object: * pq('<div/>', $pq) * * 2. Run query: * - Run query on last selected document: * pq('div.myClass') * - Run query on document with ID from $pq->getDocumentID(): * pq('div.myClass', $pq->getDocumentID()) * - Run query on same document as DOMNode belongs to and use node(s)as root for query: * pq('div.myClass', DOMNode) * - Run query on document from phpQuery object * and use object's stack as root node(s) for query: * pq('div.myClass', $pq) * * @param string|DOMNode|DOMNodeList|array $arg1 HTML markup, CSS Selector, DOMNode or array of DOMNodes * @param string|phpQueryObject|DOMNode $context DOM ID from $pq->getDocumentID(), phpQuery object (determines also query root) or DOMNode (determines also query root) * * @return phpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery|QueryTemplatesPhpQuery|false * phpQuery object or false in case of error. */ public static function pq($arg1, $context = null) { if ($arg1 instanceof DOMNODE && !isset($context)) { foreach (phpQuery::$documents as $documentWrapper) { $compare = $arg1 instanceof DOMDocument ? $arg1 : $arg1->ownerDocument; if ($documentWrapper->document->isSameNode($compare)) { $context = $documentWrapper->id; } } } if (!$context) { $domId = self::$defaultDocumentID; if (!$domId) { throw new Exception("Can't use last created DOM, because there isn't any. Use phpQuery::newDocument() first."); } // } else if (is_object($context) && ($context instanceof PHPQUERY || is_subclass_of($context, 'phpQueryObject'))) } else { if (is_object($context) && $context instanceof phpQueryObject) { $domId = $context->getDocumentID(); } else { if ($context instanceof DOMDOCUMENT) { $domId = self::getDocumentID($context); if (!$domId) { //throw new Exception('Orphaned DOMDocument'); $domId = self::newDocument($context)->getDocumentID(); } } else { if ($context instanceof DOMNODE) { $domId = self::getDocumentID($context); if (!$domId) { throw new Exception('Orphaned DOMNode'); // $domId = self::newDocument($context->ownerDocument); } } else { $domId = $context; } } } } if ($arg1 instanceof phpQueryObject) { // if (is_object($arg1) && (get_class($arg1) == 'phpQueryObject' || $arg1 instanceof PHPQUERY || is_subclass_of($arg1, 'phpQueryObject'))) { /** * Return $arg1 or import $arg1 stack if document differs: * pq(pq('<div/>')) */ if ($arg1->getDocumentID() == $domId) { return $arg1; } $class = get_class($arg1); // support inheritance by passing old object to overloaded constructor $phpQuery = $class != 'phpQuery' ? new $class($arg1, $domId) : new phpQueryObject($domId); $phpQuery->elements = array(); foreach ($arg1->elements as $node) { $phpQuery->elements[] = $phpQuery->document->importNode($node, true); } return $phpQuery; } else { if ($arg1 instanceof DOMNODE || is_array($arg1) && isset($arg1[0]) && $arg1[0] instanceof DOMNODE) { /* * Wrap DOM nodes with phpQuery object, import into document when needed: * pq(array($domNode1, $domNode2)) */ $phpQuery = new phpQueryObject($domId); if (!$arg1 instanceof DOMNODELIST && !is_array($arg1)) { $arg1 = array($arg1); } $phpQuery->elements = array(); foreach ($arg1 as $node) { $sameDocument = $node->ownerDocument instanceof DOMDOCUMENT && !$node->ownerDocument->isSameNode($phpQuery->document); $phpQuery->elements[] = $sameDocument ? $phpQuery->document->importNode($node, true) : $node; } return $phpQuery; } else { if (self::isMarkup($arg1)) { /** * Import HTML: * pq('<div/>') */ $phpQuery = new phpQueryObject($domId); return $phpQuery->newInstance($phpQuery->documentWrapper->import($arg1)); } else { /** * Run CSS query: * pq('div.myClass') */ $phpQuery = new phpQueryObject($domId); // if ($context && ($context instanceof PHPQUERY || is_subclass_of($context, 'phpQueryObject'))) if ($context && $context instanceof phpQueryObject) { $phpQuery->elements = $context->elements; } else { if ($context && $context instanceof DOMNODELIST) { $phpQuery->elements = array(); foreach ($context as $node) { $phpQuery->elements[] = $node; } } else { if ($context && $context instanceof DOMNODE) { $phpQuery->elements = array($context); } } } return $phpQuery->find($arg1); } } } }