You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

80 lines
1.5 KiB

<?php
namespace XRay\Formats;
use DOMDocument, DOMXPath;
use DateTime, DateTimeZone;
use Parse, Config;
class XKCD {
public static function parse($html, $url) {
list($doc, $xpath) = self::_loadHTML($html);
if(!$doc)
return self::_unknown();
$entry = [
'type' => 'entry',
'url' => $url,
'author' => [
'type' => 'card',
'name' => 'XKCD',
'photo' => Config::$base.'/images/xkcd.png',
'url' => 'https://xkcd.com/'
]
];
$name = $doc->getElementById('ctitle');
if(!$name)
return self::_unknown();
$entry['name'] = $name->nodeValue;
$photo = $xpath->query("//div[@id='comic']/img");
if($photo->length != 1)
return self::_unknown();
$photo = $photo->item(0);
$img1 = $photo->getAttribute('src');
$img2 = $photo->getAttribute('srcset');
if($img2) {
$img2 = explode(',', $img2)[0];
if(preg_match('/([^ ]+)/', $img2, $match)) {
$img2 = $match[1];
}
}
$src = \Mf2\resolveUrl($url, $img2 ?: $img1);
$entry['photo'] = [$src];
$response = [
'data' => $entry
];
return $response;
}
private static function _unknown() {
return [
'data' => [
'type' => 'unknown'
]
];
}
private static function _loadHTML($html) {
$doc = new DOMDocument();
@$doc->loadHTML($html);
if(!$doc) {
return [null, null];
}
$xpath = new DOMXPath($doc);
return [$doc, $xpath];
}
}