| <?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 | |
|     ]; | |
|   } | |
| 
 | |
| }
 |