| <?php | |
| namespace XRay\Formats; | |
| 
 | |
| use DateTime, DateTimeZone; | |
| use Parse, Config; | |
| use cebe\markdown\GithubMarkdown; | |
| 
 | |
| class GitHub { | |
| 
 | |
|   public static function parse($http, $url, $creds, $json=null) { | |
| 
 | |
|     if(!$json) { | |
|       // Transform the GitHub URL to an API request | |
|       if(preg_match('~https://github.com/([^/]+)/([^/]+)/pull/(\d+)$~', $url, $match)) { | |
|         $type = 'pull'; | |
|         $org = $match[1]; | |
|         $repo = $match[2]; | |
|         $pull = $match[3]; | |
|         $apiurl = 'https://api.github.com/repos/'.$org.'/'.$repo.'/pulls/'.$pull; | |
| 
 | |
|       } elseif(preg_match('~https://github.com/([^/]+)/([^/]+)/issues/(\d+)$~', $url, $match)) { | |
|         $type = 'issue'; | |
|         $org = $match[1]; | |
|         $repo = $match[2]; | |
|         $issue = $match[3]; | |
|         $apiurl = 'https://api.github.com/repos/'.$org.'/'.$repo.'/issues/'.$issue; | |
| 
 | |
|       } elseif(preg_match('~https://github.com/([^/]+)/([^/]+)$~', $url, $match)) { | |
|         $type = 'repo'; | |
|         $org = $match[1]; | |
|         $repo = $match[2]; | |
|         $apiurl = 'https://api.github.com/repos/'.$org.'/'.$repo; | |
| 
 | |
|       } elseif(preg_match('~https://github.com/([^/]+)/([^/]+)/issues/(\d+)#issuecomment-(\d+)~', $url, $match)) { | |
|         $type = 'comment'; | |
|         $org = $match[1]; | |
|         $repo = $match[2]; | |
|         $issue = $match[3]; | |
|         $comment = $match[4]; | |
|         $apiurl = 'https://api.github.com/repos/'.$org.'/'.$repo.'/issues/comments/'.$comment; | |
| 
 | |
|       } else { | |
|         return [null, null, 0]; | |
|       } | |
| 
 | |
|       $response = $http->get($apiurl, ['User-Agent: XRay ('.Config::$base.')']); | |
|       if($response['code'] != 200) { | |
|         return [null, $response['body'], $response['code']]; | |
|       } | |
| 
 | |
|       $data = json_decode($response['body'], true); | |
|     } else { | |
|       $data = json_decode($json, true); | |
|     } | |
| 
 | |
|     if(!$data) { | |
|       return [null, null, 0]; | |
|     } | |
| 
 | |
|     // Start building the h-entry | |
|     $entry = array( | |
|       'type' => ($type == 'repo' ? 'repo' : 'entry'), | |
|       'url' => $url, | |
|       'author' => [ | |
|         'type' => 'card', | |
|         'name' => null, | |
|         'photo' => null, | |
|         'url' => null | |
|       ] | |
|     ); | |
| 
 | |
|     if($type == 'repo') | |
|       $authorkey = 'owner'; | |
|     else | |
|       $authorkey = 'user'; | |
| 
 | |
|     $entry['author']['name'] = $data[$authorkey]['login']; | |
|     $entry['author']['photo'] = $data[$authorkey]['avatar_url']; | |
|     $entry['author']['url'] = $data[$authorkey]['html_url']; | |
| 
 | |
|     if($type == 'pull') { | |
|       $entry['name'] = '#' . $pull . ' ' . $data['title']; | |
|     } elseif($type == 'issue') { | |
|       $entry['name'] = '#' . $issue . ' ' . $data['title']; | |
|     } elseif($type == 'repo') { | |
|       $entry['name'] = $data['name']; | |
|     } | |
| 
 | |
|     if($type == 'repo') { | |
|       if(!empty($data['description'])) | |
|         $entry['summary'] = $data['description']; | |
|     } | |
| 
 | |
|     if($type != 'repo' && !empty($data['body'])) { | |
|       $parser = new GithubMarkdown(); | |
| 
 | |
|       $entry['content'] = [ | |
|         'text' => $data['body'], | |
|         'html' => $parser->parse($data['body']) | |
|       ]; | |
|     } | |
| 
 | |
|     if(!empty($data['labels'])) { | |
|       $entry['category'] = $data['labels']; | |
|     } | |
| 
 | |
|     $entry['published'] = $data['created_at']; | |
| 
 | |
|     $response = [ | |
|       'data' => $entry | |
|     ]; | |
| 
 | |
|     return [$response, $json, $response['code']]; | |
|   } | |
| 
 | |
| }
 |