'feed', 'items' => [], ]; // Given an mf2 data structure from a web page, assume it is a feed of entries // and return the XRay data structure for the feed. // Look for the first (BFS) h-feed if present, otherwise use the list of items. // Normalize this into a simpler mf2 structure, (h-feed -> h-* children) $feed = self::_findFirstOfType($mf2, 'h-feed'); if(!$feed) { // There was no h-feed. // Check for a top-level h-card with children if(isset($mf2['items'][0]) && in_array('h-card', $mf2['items'][0]['type'])) { $feed = $mf2['items'][0]; // If the h-card has children, use them, otherwise look for siblings if(!isset($feed['children'])) { $items = self::_findAllObjectsExcept($mf2, ['h-card']); $feed['children'] = $items; } } else { $children = self::_findAllObjectsExcept($mf2, ['h-card','h-feed']); $feed = [ 'type' => ['h-feed'], 'properties' => [], 'children' => $children ]; } } if(!isset($feed['children'])) $feed['children'] = []; // Now that the feed has been normalized so all the items are under "children", we // can transform each entry into the XRay format, including finding the author, etc foreach($feed['children'] as $item) { $parsed = false; if(in_array('h-entry', $item['type']) || in_array('h-cite', $item['type'])) { $parsed = self::parseAsHEntry($mf2, $item, false, $url); } elseif(in_array('h-event', $item['type'])) { $parsed = self::parseAsHEvent($mf2, $item, false, $url); } elseif(in_array('h-review', $item['type'])) { $parsed = self::parseAsHReview($mf2, $item, false, $url); } elseif(in_array('h-recipe', $item['type'])) { $parsed = self::parseAsHRecipe($mf2, $item, false, $url); } elseif(in_array('h-product', $item['type'])) { $parsed = self::parseAsHProduct($mf2, $item, false, $url); } elseif(in_array('h-item', $item['type'])) { $parsed = self::parseAsHItem($mf2, $item, false, $url); } elseif(in_array('h-card', $item['type'])) { $parsed = self::parseAsHCard($item, false, $url); } if($parsed) { $data['items'][] = $parsed['data']; } } return [ 'data' => $data, 'source-format' => 'mf2+html', ]; } private static function _findFirstOfType($mf2, $type) { foreach($mf2['items'] as $item) { if(in_array($type, $item['type'])) { return $item; } else { if(isset($item['children'])) { $items = $item['children']; return self::_findFirstOfType(['items'=>$items], $type); } } } } private static function _findAllObjectsExcept($mf2, $types) { $items = []; foreach($mf2['items'] as $item) { if(count(array_intersect($item['type'], $types)) == 0) { $items[] = $item; } } return $items; } }