Beispiel #1
0
 /**
  * Tests traversing
  *
  * @covers CDomList
  * @covers CDomNode
  * @covers CDomNodesList
  */
 function testTraversing()
 {
     $dom = CDom::fromString($this->test_html2);
     // ---
     $l = $dom->find('body')->find('li:eq(1)')->andSelf();
     $this->assertEquals(2, $l->length);
     $i = 0;
     $el = $l->get($i++);
     $this->assertEquals('li2', $el->id);
     $el = $l->get($i);
     $this->assertEquals('body', $el->name);
     // ---
     $l = $dom->find('*')->first();
     $this->assertEquals(1, $l->length);
     $this->assertEquals('html', $l->name);
     /** @noinspection PhpUndefinedMethodInspection */
     $l->end()->last();
     $this->assertEquals(1, $l->length);
     $this->assertEquals('h6', $l->name);
     /** @noinspection PhpUndefinedMethodInspection */
     $l->end()->slice(-2);
     $this->assertEquals(2, $l->length);
     $i = 0;
     $el = $l->get($i++);
     $this->assertEquals('h1', $el->name);
     $el = $l->get($i);
     $this->assertEquals('h6', $el->name);
     /** @noinspection PhpUndefinedMethodInspection */
     $l->end()->slice(3, 3);
     $this->assertEquals(3, $l->length);
     $i = 0;
     $el = $l->get($i++);
     $this->assertEquals('title', $el->name);
     $el = $l->get($i++);
     $this->assertEquals('body', $el->name);
     $el = $l->get($i);
     $this->assertEquals('div', $el->name);
     $list = $dom->find('list');
     /** @noinspection PhpUndefinedMethodInspection */
     $index = $l->end()->index($list);
     $this->assertEquals(7, $index);
     /** @var $res CDomNodesList */
     $res = $l->eq(7);
     $this->assertEquals($list->uniqId, $res->uniqId);
     /** @noinspection PhpUndefinedMethodInspection */
     $res = $l->end()->eq(-11);
     $this->assertEquals($list->uniqId, $res->uniqId);
     /** @noinspection PhpUndefinedMethodInspection */
     $index = $l->end()->index(new CDomNodeText());
     $this->assertEquals(-1, $index);
     // ---
     $el = $list->get(0);
     $res = $el->has('li');
     $this->assertTrue($res);
     $res = $el->has('p');
     $this->assertFalse($res);
     /** @var $li CDomNodeTag */
     $li = $el->firstChild;
     $res = $li->has('*');
     $this->assertFalse($res);
     // Not
     $list2 = $dom('li')->not('#li2');
     $this->assertEquals(3, $list2->length);
     $i = 0;
     $el = $list2->get($i++);
     $this->assertEquals('li1', $el->attr('id'));
     $el = $list2->get($i++);
     $this->assertEquals('li3', $el->attr('id'));
     $el = $list2->get($i);
     $this->assertEquals('li4', $el->attr('id'));
     // Is
     $list2 = $dom('li');
     $this->assertTrue($list2->is('li'));
     $this->assertTrue($list2->is('#li4'));
     $this->assertFalse($list2->is('div'));
     // Contents
     $list2 = $dom->find('list')->contents();
     $this->assertEquals(9, $list2->length);
     foreach ($list2 as $i => $n) {
         if ($i & 1) {
             $this->assertTrue($n instanceof CDomNodeTag);
         } else {
             $this->assertTrue($n instanceof CDomNodeText);
         }
     }
     // Children
     $list2 = $list->get(0)->children();
     $this->assertEquals(4, $list2->length);
     $i = 0;
     $el = $list2->get($i++);
     $this->assertEquals('li1', $el->attr('id'));
     $el = $list2->get($i++);
     $this->assertEquals('li2', $el->attr('id'));
     $el = $list2->get($i++);
     $this->assertEquals('li3', $el->attr('id'));
     $el = $list2->get($i);
     $this->assertEquals('li4', $el->attr('id'));
     $list2 = $list->first->children('#li2,#li4');
     $this->assertEquals(2, $list2->length);
     $i = 0;
     $el = $list2->get($i++);
     $this->assertEquals('li2', $el->attr('id'));
     $el = $list2->get($i);
     $this->assertEquals('li4', $el->attr('id'));
     $list2 = $list->children(':not(#li3)');
     $this->assertEquals(3, $list2->length);
     $i = 0;
     $el = $list2->get($i++);
     $this->assertEquals('li1', $el->attr('id'));
     $el = $list2->get($i++);
     $this->assertEquals('li2', $el->attr('id'));
     $el = $list2->get($i);
     $this->assertEquals('li4', $el->attr('id'));
     $list->end();
     // Parent
     $list2 = $dom->find('li:eq(0),title');
     $list2->parent();
     $this->assertEquals(2, $list2->length);
     $list2->end();
     $list2->parent('head');
     $this->assertEquals(1, $list2->length);
     // Parents
     $list2 = $li->parents();
     $this->assertEquals(4, $list2->length);
     $this->assertEquals($list2->length, count($list2->list));
     $this->assertEquals($list2->length, count($list2->listByIds));
     $i = 0;
     $el = $list2->get($i++);
     $this->assertEquals('list', $el->name);
     $el = $list2->get($i++);
     $this->assertEquals('div', $el->name);
     $el = $list2->get($i++);
     $this->assertEquals('body', $el->name);
     $el = $list2->get($i);
     $this->assertEquals('html', $el->name);
     $list2 = $li->parents('html,div');
     $this->assertEquals(2, $list2->length);
     $i = 0;
     $el = $list2->get($i++);
     $this->assertEquals('div', $el->name);
     $el = $list2->get($i);
     $this->assertEquals('html', $el->name);
     $list2 = $li->parents(':not(html,div)');
     $this->assertEquals(2, $list2->length);
     $i = 0;
     $el = $list2->get($i++);
     $this->assertEquals('list', $el->name);
     $el = $list2->get($i);
     $this->assertEquals('body', $el->name);
     $list2 = $li->parentsUntil('div');
     $this->assertEquals(1, $list2->length);
     $i = 0;
     $el = $list2->get($i);
     $this->assertEquals('list', $el->name);
     $list2 = $dom->find('li:eq(0),p:eq(1)');
     $list2->parents();
     $this->assertEquals(4, $list2->length);
     /** @noinspection PhpUndefinedMethodInspection */
     $list2->end()->parents('body');
     $this->assertEquals(1, $list2->length);
     // parentsUntil
     $list2 = $li->parentsUntil('html');
     $this->assertEquals(3, $list2->length);
     $i = 0;
     $el = $list2->get($i++);
     $this->assertEquals('list', $el->name);
     $el = $list2->get($i++);
     $this->assertEquals('div', $el->name);
     $el = $list2->get($i);
     $this->assertEquals('body', $el->name);
     $list2 = $li->parentsUntil('list');
     $this->assertEquals(0, $list2->length);
     $list2 = $dom->find('li:eq(0),p:eq(1)');
     $list2->parentsUntil('body');
     $this->assertEquals(2, $list2->length);
     // closest
     $el = $li->closest('div');
     $this->assertEquals('div', $el->name);
     $el = $li->closest('html');
     $this->assertEquals('html', $el->name);
     $el = $li->closest('list,body');
     $this->assertEquals('list', $el->name);
     $el = $li->closest('p');
     $this->assertEmpty($el);
     $el = $dom->find('p:eq(1)')->closest('body');
     $this->assertEquals('body', $el->name);
     $list2 = new CDomNodesList();
     $this->assertEmpty($list2->closest('*'));
     // next
     $list2 = $dom->find('li:eq(0),p:eq(1)');
     $list2->getNext();
     $this->assertEquals(2, $list2->length);
     $i = 0;
     $el = $list2->get($i++);
     $this->assertEquals('li2', $el->attr('id'));
     $el = $list2->get($i);
     $this->assertEquals('p3', $el->attr('id'));
     /** @noinspection PhpUndefinedMethodInspection */
     $list2->end()->getNext('p');
     $this->assertEquals(1, $list2->length);
     $el = $list2->get(0);
     $this->assertEquals('p3', $el->attr('id'));
     // nextAll
     $list2 = $li->nextAll();
     $this->assertEquals(3, $list2->length);
     foreach ($list2 as $el) {
         $this->assertEquals('li', $el->name);
     }
     $i = 0;
     $el = $list2->get($i++);
     $this->assertEquals('li2', $el->attr('id'));
     $el = $list2->get($i++);
     $this->assertEquals('li3', $el->attr('id'));
     $el = $list2->get($i);
     $this->assertEquals('li4', $el->attr('id'));
     $list2 = $li->nextAll('#li3');
     $this->assertEquals(1, $list2->length);
     $el = $list2->get(0);
     $this->assertEquals('li3', $el->attr('id'));
     $list2 = $dom->find('li:eq(1),p:eq(2)');
     $list2->nextAll();
     $this->assertEquals(4, $list2->length);
     $i = 1;
     $el = $list2->get($i++);
     $this->assertEquals('li4', $el->id);
     $el = $list2->get($i++);
     $this->assertEquals('h1', $el->name);
     $el = $list2->get($i);
     $this->assertEquals('h6', $el->name);
     /** @noinspection PhpUndefinedMethodInspection */
     $list2->end()->nextAll(':header');
     $this->assertEquals(2, $list2->length);
     $i = 0;
     $el = $list2->get($i++);
     $this->assertEquals('h1', $el->name);
     $el = $list2->get($i);
     $this->assertEquals('h6', $el->name);
     // nextUntil
     $list2 = $li->nextUntil('#li4');
     $this->assertEquals(2, $list2->length);
     $i = 0;
     $el = $list2->get($i++);
     $this->assertEquals('li2', $el->attr('id'));
     $el = $list2->get($i);
     $this->assertEquals('li3', $el->attr('id'));
     $list2 = $li->nextUntil('#li2');
     $this->assertEquals(0, $list2->length);
     $list2 = $dom->find('li:eq(1),p:eq(2)')->nextUntil(':header');
     $this->assertEquals(2, $list2->length);
     // prev
     $list2 = $dom->find('li:eq(1),p:eq(2)');
     $list2->getPrev();
     $this->assertEquals(2, $list2->length);
     $i = 0;
     $el = $list2->get($i++);
     $this->assertEquals('li1', $el->attr('id'));
     $el = $list2->get($i);
     $this->assertEquals('p2', $el->attr('id'));
     /** @noinspection PhpUndefinedMethodInspection */
     $list2->end()->getPrev('p');
     $this->assertEquals(1, $list2->length);
     $el = $list2->get(0);
     $this->assertEquals('p2', $el->attr('id'));
     // prevAll
     $li3 = $li->next->next;
     $list2 = $li3->prevAll();
     $this->assertEquals(2, $list2->length);
     $i = 0;
     $el = $list2->get($i++);
     $this->assertEquals('li2', $el->attr('id'));
     $el = $list2->get($i);
     $this->assertEquals('li1', $el->attr('id'));
     $list2 = $li3->prevAll('#li1');
     $this->assertEquals(1, $list2->length);
     $el = $list2->get(0);
     $this->assertEquals('li1', $el->attr('id'));
     $list2 = $dom->find('li:eq(1),p:eq(2)');
     $list2->prevAll();
     $this->assertEquals(6, $list2->length);
     $i = 0;
     $el = $list2->get($i++);
     $this->assertEquals('li', $el->name);
     $el = $list2->get($i++);
     $this->assertEquals('p', $el->name);
     $el = $list2->get($i++);
     $this->assertEquals('p', $el->name);
     $el = $list2->get($i++);
     $this->assertEquals('hr', $el->name);
     $el = $list2->get($i++);
     $this->assertEquals('list', $el->name);
     $el = $list2->get($i);
     $this->assertEquals('br', $el->name);
     /** @noinspection PhpUndefinedMethodInspection */
     $list2->end()->prevAll('list');
     $this->assertEquals(1, $list2->length);
     $el = $list2->get(0);
     $this->assertEquals('list', $el->name);
     // prevUntil
     $list2 = $li3->prevUntil('#li1');
     $this->assertEquals(1, $list2->length);
     $el = $list2->get(0);
     $this->assertEquals('li2', $el->attr('id'));
     $list2 = $li3->prevUntil('#li2');
     $this->assertEquals(0, $list2->length);
     $list2 = $dom->find('li:eq(1),p:eq(2)')->prevUntil('hr');
     $this->assertEquals(3, $list2->length);
     // siblings
     $list2 = $li3->siblings();
     $this->assertEquals(3, $list2->length);
     $i = 0;
     $el = $list2->get($i++);
     $this->assertEquals('li2', $el->attr('id'));
     $el = $list2->get($i++);
     $this->assertEquals('li1', $el->attr('id'));
     $el = $list2->get($i);
     $this->assertEquals('li4', $el->attr('id'));
     $list2 = $dom->find('li:eq(1),p:eq(2)')->siblings();
     $this->assertEquals(10, $list2->length);
     /** @noinspection PhpUndefinedMethodInspection */
     $list2->end()->siblings(':not(p)');
     $this->assertEquals(8, $list2->length);
     $dom->clear();
 }
Beispiel #2
0
 /**
  * Prepares content, for manipulation.
  *
  * @param string|CDomNode|CDomNode[]|CDomDocument|CDomNodesList $content
  *
  * @return CDomNodesList|false returns FALSE if content is empty
  */
 protected function prepareContent($content)
 {
     if (!$content instanceof CDomNodesList) {
         // Document
         if ($content instanceof CDomDocument) {
             $content =& $content->detachChildren();
         } else {
             if (!is_object($content) && !is_array($content)) {
                 $content = CDom::fromString($content);
                 $content =& $content->detachChildren();
             }
         }
         $list = new self();
         $list->add($content);
         $content = $list;
     }
     return $content->length ? $content : false;
 }