diff --git a/Mf2/Parser.php b/Mf2/Parser.php index 27805f2..bbba5f2 100644 --- a/Mf2/Parser.php +++ b/Mf2/Parser.php @@ -127,9 +127,9 @@ function mfNamesFromClass($class, $prefix='h-') { $matches = array(); foreach ($classes as $classname) { - $compare_classname = strtolower(' ' . $classname); - $compare_prefix = strtolower(' ' . $prefix); - if (stristr($compare_classname, $compare_prefix) !== false && ($compare_classname != $compare_prefix)) { + $compare_classname = ' ' . $classname; + $compare_prefix = ' ' . $prefix; + if (strstr($compare_classname, $compare_prefix) !== false && ($compare_classname != $compare_prefix)) { $matches[] = ($prefix === 'h-') ? $classname : substr($classname, strlen($prefix)); } } @@ -688,6 +688,11 @@ public function parseH(\DOMElement $e) { $this->elementPrefixParsed($subMF, 'dt'); $this->elementPrefixParsed($subMF, 'e'); } + if($e->tagName == 'area') { + $coords = $e->getAttribute('coords'); + $shape = $e->getAttribute('shape'); + + } // Handle p-* foreach ($this->xpath->query('.//*[contains(concat(" ", @class) ," p-")]', $e) as $p) { @@ -762,7 +767,7 @@ public function parseH(\DOMElement $e) { if (!array_key_exists('name', $return)) { try { // Look for img @alt - if ($e->tagName == 'img' and $e->getAttribute('alt') != '') + if (($e->tagName == 'img' or $e->tagName == 'area') and $e->getAttribute('alt') != '') throw new Exception($e->getAttribute('alt')); if ($e->tagName == 'abbr' and $e->hasAttribute('title')) @@ -770,14 +775,35 @@ public function parseH(\DOMElement $e) { // Look for nested img @alt foreach ($this->xpath->query('./img[count(preceding-sibling::*)+count(following-sibling::*)=0]', $e) as $em) { - if ($em->getAttribute('alt') != '') + $emNames = mfNamesFromElement($em, 'h-'); + if(empty($emNames) && $em->getAttribute('alt') != ''){ + throw new Exception($em->getAttribute('alt')); + } + } + + // Look for nested area @alt + foreach ($this->xpath->query('./area[count(preceding-sibling::*)+count(following-sibling::*)=0]', $e) as $em) { + $emNames = mfNamesFromElement($em, 'h-'); + if(empty($emNames) && $em->getAttribute('alt') != ''){ throw new Exception($em->getAttribute('alt')); + } } + // Look for double nested img @alt foreach ($this->xpath->query('./*[count(preceding-sibling::*)+count(following-sibling::*)=0]/img[count(preceding-sibling::*)+count(following-sibling::*)=0]', $e) as $em) { - if ($em->getAttribute('alt') != '') + $emNames = mfNamesFromElement($em, 'h-'); + if(empty($emNames) && $em->getAttribute('alt') != ''){ throw new Exception($em->getAttribute('alt')); + } + } + + // Look for double nested img @alt + foreach ($this->xpath->query('./*[count(preceding-sibling::*)+count(following-sibling::*)=0]/area[count(preceding-sibling::*)+count(following-sibling::*)=0]', $e) as $em) { + $emNames = mfNamesFromElement($em, 'h-'); + if(empty($emNames) && $em->getAttribute('alt') != ''){ + throw new Exception($em->getAttribute('alt')); + } } throw new Exception($e->nodeValue); @@ -812,13 +838,25 @@ public function parseH(\DOMElement $e) { // Check for u-url if (!array_key_exists('url', $return)) { // Look for img @src - if ($e->tagName == 'a') + if ($e->tagName == 'a' or $e->tagName == 'area') $url = $e->getAttribute('href'); - // Look for nested img @src + // Look for nested a @href foreach ($this->xpath->query('./a[count(preceding-sibling::a)+count(following-sibling::a)=0]', $e) as $em) { - $url = $em->getAttribute('href'); - break; + $emNames = mfNamesFromElement($em, 'h-'); + if(empty($emNames)){ + $url = $em->getAttribute('href'); + break; + } + } + + // Look for nested area @src + foreach ($this->xpath->query('./area[count(preceding-sibling::area)+count(following-sibling::area)=0]', $e) as $em) { + $emNames = mfNamesFromElement($em, 'h-'); + if(empty($emNames)){ + $url = $em->getAttribute('href'); + break; + } } if (!empty($url)) @@ -833,6 +871,12 @@ public function parseH(\DOMElement $e) { 'type' => $mfTypes, 'properties' => $return ); + if (!empty($shape)){ + $parsed['shape'] = $shape; + } + if (!empty($coords)){ + $parsed['coords'] = $coords; + } if (!empty($children)) $parsed['children'] = array_values(array_filter($children)); return $parsed; diff --git a/phpunit.xml b/phpunit.xml index 07b176f..08a3463 100644 --- a/phpunit.xml +++ b/phpunit.xml @@ -1,8 +1,8 @@ - + - tests/mf2 + tests/Mf2 - \ No newline at end of file + diff --git a/tests/Mf2/ParserTest.php b/tests/Mf2/ParserTest.php index 3d5303a..fadce67 100644 --- a/tests/Mf2/ParserTest.php +++ b/tests/Mf2/ParserTest.php @@ -129,6 +129,7 @@ public function testHtmlEncodesNonEProperties() { $this->assertEquals('
', $output['items'][0]['properties']['published'][0]); $this->assertEquals('', $output['items'][0]['properties']['url'][0]); } + public function testHtmlEncodesImpliedProperties() { $input = '<name>'; @@ -257,4 +258,52 @@ public function testConvertsNestedImgElementToAltOrSrc() { $result = Mf2\parse($input, 'http://waterpigs.co.uk/articles/five-legged-elephant'); $this->assertEquals('It is a strange thing to see a five legged elephant', $result['items'][0]['properties']['content'][0]['value']); } + + // parser not respecting not[h-*] in rule "else if .h-x>a[href]:only-of-type:not[.h-*] then use that [href] for url" + public function testNotImpliedUrlFromHCard() { + $input = ' + John Q + '; + + $parser = new Parser($input); + $output = $parser->parse(); + + $this->assertArrayNotHasKey('url', $output['items'][0]['properties']); + } + + public function testAreaTag() { + $input = '
+ Person Bee +
'; + + $parser = new Parser($input); + $output = $parser->parse(); + + $this->assertEquals('', $output['items'][0]['properties']['name'][0]); + $this->assertEquals('rect', $output['items'][0]['properties']['category'][0]['shape']); + $this->assertEquals('100,100,120,120', $output['items'][0]['properties']['category'][0]['coords']); + $this->assertEquals('Person Bee', $output['items'][0]['properties']['category'][0]['value']); + + } + + public function testParseHcardInCategory() { + + $input = ' + Alice tagged + Bob Smith in + + a photo of Bob and Cole + '; + + $parser = new Parser($input); + $output = $parser->parse(); + + $this->assertContains('h-entry', $output['items'][0]['type']); + $this->assertArrayHasKey('category', $output['items'][0]['properties']); + $this->assertContains('h-card', $output['items'][0]['properties']['category'][0]['type']); + $this->assertArrayHasKey('name', $output['items'][0]['properties']['category'][0]['properties']); + $this->assertEquals('Bob Smith', $output['items'][0]['properties']['category'][0]['properties']['name'][0]); + $this->assertArrayHasKey('url', $output['items'][0]['properties']['category'][0]['properties']); + $this->assertEquals('http://b.example.com/', $output['items'][0]['properties']['category'][0]['properties']['url'][0]); + } }