<?php
|
|
namespace p3k\XRay\Formats;
|
|
|
|
use DateTime, DateTimeZone;
|
|
use Config;
|
|
use cebe\markdown\GithubMarkdown;
|
|
|
|
class Hackernews extends Format {
|
|
|
|
public static function matches_host($url) {
|
|
$host = parse_url($url, PHP_URL_HOST);
|
|
return $host == 'news.ycombinator.com';
|
|
}
|
|
|
|
public static function matches($url) {
|
|
if(preg_match('~https?://news\.ycombinator\.com/item\?id=(\d+)$~', $url, $match))
|
|
return $match;
|
|
else
|
|
return false;
|
|
}
|
|
|
|
public static function fetch($http, $url, $opts) {
|
|
$match = self::matches($url);
|
|
|
|
$response = $http->get('https://hacker-news.firebaseio.com/v0/item/'.$match[1].'.json');
|
|
if($response['code'] != 200) {
|
|
return [
|
|
'error' => 'hackernews_error',
|
|
'error_description' => $response['body'],
|
|
'code' => $response['code'],
|
|
];
|
|
}
|
|
|
|
return [
|
|
'url' => $url,
|
|
'body' => $response['body'],
|
|
'code' => $response['code'],
|
|
];
|
|
}
|
|
|
|
public static function parse($json, $url) {
|
|
$data = @json_decode($json, true);
|
|
|
|
if(!$data)
|
|
return self::_unknown();
|
|
|
|
$match = self::matches($url);
|
|
|
|
$date = DateTime::createFromFormat('U', $data['time']);
|
|
|
|
// Start building the h-entry
|
|
$entry = array(
|
|
'type' => 'entry',
|
|
'url' => $url,
|
|
'author' => [
|
|
'type' => 'card',
|
|
'name' => $data['by'],
|
|
'photo' => null,
|
|
'url' => 'https://news.ycombinator.com/user?id='.$data['by']
|
|
],
|
|
'published' => $date->format('c')
|
|
);
|
|
|
|
if(isset($data['title'])) {
|
|
$entry['name'] = $data['title'];
|
|
}
|
|
|
|
if(isset($data['text'])) {
|
|
$htmlContent = trim(self::sanitizeHTML($data['text']));
|
|
$textContent = str_replace('<p>', "\n<p>", $htmlContent);
|
|
$textContent = strip_tags($textContent);
|
|
$entry['content'] = [
|
|
'html' => $htmlContent,
|
|
'text' => $textContent
|
|
];
|
|
}
|
|
|
|
if(isset($data['parent'])) {
|
|
$entry['in-reply-to'] = ['https://news.ycombinator.com/item?id='.$data['parent']];
|
|
}
|
|
|
|
return [
|
|
'data' => $entry,
|
|
'original' => $json
|
|
];
|
|
}
|
|
|
|
}
|