|
|
- <?php
- namespace p3k\XRay\Formats;
-
- use DateTime, DateTimeZone;
- use Config;
- use cebe\markdown\GithubMarkdown;
-
- class GitHub extends Format {
-
- public static function matches_host($url) {
- $host = parse_url($url, PHP_URL_HOST);
- return $host == 'github.com';
- }
-
- public static function matches($url) {
- return preg_match('~https://github.com/([^/]+)/([^/]+)/pull/(\d+)$~', $url, $match)
- || preg_match('~https://github.com/([^/]+)/([^/]+)/issues/(\d+)$~', $url, $match)
- || preg_match('~https://github.com/([^/]+)/([^/]+)$~', $url, $match)
- || preg_match('~https://github.com/([^/]+)/([^/]+)/issues/(\d+)#issuecomment-(\d+)~', $url, $match);
- }
-
- public static function fetch($http, $url, $creds) {
- // 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 [
- 'error' => 'unsupported_url',
- 'error_description' => 'This GitHub URL is not supported',
- 'error_code' => 400,
- ];
- }
-
- $headers = [];
- if(isset($creds['github_access_token'])) {
- $headers[] = 'Authorization: Bearer ' . $creds['github_access_token'];
- }
-
- $response = $http->get($apiurl, $headers);
- if($response['code'] != 200) {
- return [
- 'error' => 'github_error',
- 'error_description' => $response['body'],
- 'code' => $response['code'],
- ];
- }
-
- return [
- 'url' => $url,
- 'body' => $response['body'],
- 'code' => $response['code'],
- ];
- }
-
- public static function parse($http, $url, $creds, $json=null) {
-
- if(false) {
- } 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($type == 'comment') {
- $entry['in-reply-to'] = ['https://github.com/'.$org.'/'.$repo.'/issues/'.$issue];
- }
-
- if(!empty($data['labels'])) {
- $entry['category'] = array_map(function($l){
- return $l['name'];
- }, $data['labels']);
- }
-
- $entry['published'] = $data['created_at'];
-
- $r = [
- 'data' => $entry
- ];
-
- return [$r, $json, $response['code']];
- }
-
- }
|