<?php
|
|
namespace p3k\XRay\Formats;
|
|
|
|
trait Mf2Feed {
|
|
|
|
private static function parseAsHFeed($mf2, $http, $url) {
|
|
$data = [
|
|
'type' => '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
|
|
];
|
|
}
|
|
|
|
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;
|
|
}
|
|
|
|
}
|