| @ -0,0 +1,119 @@ | |||||
| <?php | |||||
| namespace XRay\Formats; | |||||
| use DateTime, DateTimeZone; | |||||
| use Parse; | |||||
| 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]; | |||||
| } | |||||
| $response = $http->get($apiurl); | |||||
| if($response['code'] != 200) { | |||||
| return [null, null]; | |||||
| } | |||||
| $data = json_decode($response['body'], true); | |||||
| } else { | |||||
| $data = json_decode($json, true); | |||||
| } | |||||
| if(!$data) { | |||||
| return [null, null]; | |||||
| } | |||||
| // 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']; | |||||
| #$entry['author'] | |||||
| $response = [ | |||||
| 'data' => $entry | |||||
| ]; | |||||
| return [$response, $json]; | |||||
| } | |||||
| } | |||||
| @ -0,0 +1,96 @@ | |||||
| <?php | |||||
| use Symfony\Component\HttpFoundation\Request; | |||||
| use Symfony\Component\HttpFoundation\Response; | |||||
| class GitHubTest extends PHPUnit_Framework_TestCase { | |||||
| private $http; | |||||
| public function setUp() { | |||||
| $this->client = new Parse(); | |||||
| $this->client->http = new p3k\HTTPTest(dirname(__FILE__).'/data/'); | |||||
| $this->client->mc = null; | |||||
| } | |||||
| private function parse($params) { | |||||
| $request = new Request($params); | |||||
| $response = new Response(); | |||||
| return $this->client->parse($request, $response); | |||||
| } | |||||
| public function testGitHubPull() { | |||||
| // Original URL: https://github.com/idno/Known/pull/1690 | |||||
| $url = 'https://github.com/idno/Known/pull/1690'; | |||||
| $response = $this->parse(['url' => $url]); | |||||
| $body = $response->getContent(); | |||||
| $this->assertEquals(200, $response->getStatusCode()); | |||||
| $data = json_decode($body, true); | |||||
| $this->assertEquals('entry', $data['data']['type']); | |||||
| $this->assertEquals('2017-04-10T17:44:57Z', $data['data']['published']); | |||||
| $this->assertEquals('aaronpk', $data['data']['author']['name']); | |||||
| $this->assertEquals('https://github.com/aaronpk', $data['data']['author']['url']); | |||||
| $this->assertEquals('https://avatars2.githubusercontent.com/u/113001?v=3', $data['data']['author']['photo']); | |||||
| $this->assertEquals('#1690 fixes bookmark Microformats markup', $data['data']['name']); | |||||
| $this->assertContains('<h2>Here\'s what I fixed or added:</h2>', $data['data']['content']['html']); | |||||
| $this->assertContains('## Here\'s what I fixed or added:', $data['data']['content']['text']); | |||||
| } | |||||
| public function testGitHubIssue() { | |||||
| $url = 'https://github.com/aaronpk/XRay/issues/25'; | |||||
| $response = $this->parse(['url' => $url]); | |||||
| $body = $response->getContent(); | |||||
| $this->assertEquals(200, $response->getStatusCode()); | |||||
| $data = json_decode($body, true); | |||||
| $this->assertEquals('entry', $data['data']['type']); | |||||
| $this->assertEquals('2017-01-26T14:13:42Z', $data['data']['published']); | |||||
| $this->assertEquals('sebsel', $data['data']['author']['name']); | |||||
| $this->assertEquals('https://github.com/sebsel', $data['data']['author']['url']); | |||||
| $this->assertEquals('https://avatars3.githubusercontent.com/u/16517999?v=3', $data['data']['author']['photo']); | |||||
| $this->assertEquals('#25 Post type discovery', $data['data']['name']); | |||||
| $this->assertContains('<blockquote>', $data['data']['content']['html']); | |||||
| $this->assertContains('<a href="https://www.w3.org/TR/post-type-discovery/">', $data['data']['content']['html']); | |||||
| $this->assertContains('> sebsel', $data['data']['content']['text']); | |||||
| } | |||||
| public function testGitHubRepo() { | |||||
| $url = 'https://github.com/aaronpk/XRay'; | |||||
| $response = $this->parse(['url' => $url]); | |||||
| $body = $response->getContent(); | |||||
| $this->assertEquals(200, $response->getStatusCode()); | |||||
| $data = json_decode($body, true); | |||||
| $this->assertEquals('repo', $data['data']['type']); | |||||
| $this->assertEquals('2016-02-19T16:53:20Z', $data['data']['published']); | |||||
| $this->assertEquals('aaronpk', $data['data']['author']['name']); | |||||
| $this->assertEquals('https://github.com/aaronpk', $data['data']['author']['url']); | |||||
| $this->assertEquals('https://avatars2.githubusercontent.com/u/113001?v=3', $data['data']['author']['photo']); | |||||
| $this->assertEquals('XRay', $data['data']['name']); | |||||
| $this->assertEquals('X-Ray returns structured data from any URL', $data['data']['summary']); | |||||
| } | |||||
| public function testGitHubIssueComment() { | |||||
| $url = 'https://github.com/aaronpk/XRay/issues/25#issuecomment-275433926'; | |||||
| $response = $this->parse(['url' => $url]); | |||||
| $body = $response->getContent(); | |||||
| $this->assertEquals(200, $response->getStatusCode()); | |||||
| $data = json_decode($body, true); | |||||
| $this->assertEquals('entry', $data['data']['type']); | |||||
| $this->assertEquals('2017-01-26T16:24:37Z', $data['data']['published']); | |||||
| $this->assertEquals('sebsel', $data['data']['author']['name']); | |||||
| $this->assertEquals('https://avatars3.githubusercontent.com/u/16517999?v=3', $data['data']['author']['photo']); | |||||
| $this->assertEquals('https://github.com/sebsel', $data['data']['author']['url']); | |||||
| $this->assertContains('<p>Well it\'s just that php-comments does more than XRay does currently. But that\'s no good reason.</p>', $data['data']['content']['html']); | |||||
| $this->assertContains('<code class="language-php">', $data['data']['content']['html']); | |||||
| $this->assertContains('```php', $data['data']['content']['text']); | |||||
| $this->assertNotContains('name', $data['data']); | |||||
| } | |||||
| } | |||||
| @ -0,0 +1,116 @@ | |||||
| HTTP/1.1 200 OK | |||||
| Server: GitHub.com | |||||
| Date: Fri, 21 Apr 2017 15:58:55 GMT | |||||
| Content-Type: application/json; charset=utf-8 | |||||
| Content-Length: 4836 | |||||
| Status: 200 OK | |||||
| X-RateLimit-Limit: 60 | |||||
| X-RateLimit-Remaining: 50 | |||||
| X-RateLimit-Reset: 1492790890 | |||||
| Cache-Control: public, max-age=60, s-maxage=60 | |||||
| Vary: Accept | |||||
| ETag: "8ddf616bbf7eed6b81084fcdd8087305" | |||||
| Last-Modified: Thu, 02 Mar 2017 18:36:20 GMT | |||||
| X-GitHub-Media-Type: github.v3; format=json | |||||
| Access-Control-Expose-Headers: ETag, Link, X-GitHub-OTP, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset, X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Poll-Interval | |||||
| Access-Control-Allow-Origin: * | |||||
| Content-Security-Policy: default-src 'none' | |||||
| Strict-Transport-Security: max-age=31536000; includeSubdomains; preload | |||||
| X-Content-Type-Options: nosniff | |||||
| X-Frame-Options: deny | |||||
| X-XSS-Protection: 1; mode=block | |||||
| Vary: Accept-Encoding | |||||
| X-Served-By: 10ea50bffaded85949561216def301f3 | |||||
| X-GitHub-Request-Id: CED9:2FD1:1A1E1CE:209452A:58FA2C3F | |||||
| { | |||||
| "id": 52102380, | |||||
| "name": "XRay", | |||||
| "full_name": "aaronpk/XRay", | |||||
| "owner": { | |||||
| "login": "aaronpk", | |||||
| "id": 113001, | |||||
| "avatar_url": "https://avatars2.githubusercontent.com/u/113001?v=3", | |||||
| "gravatar_id": "", | |||||
| "url": "https://api.github.com/users/aaronpk", | |||||
| "html_url": "https://github.com/aaronpk", | |||||
| "followers_url": "https://api.github.com/users/aaronpk/followers", | |||||
| "following_url": "https://api.github.com/users/aaronpk/following{/other_user}", | |||||
| "gists_url": "https://api.github.com/users/aaronpk/gists{/gist_id}", | |||||
| "starred_url": "https://api.github.com/users/aaronpk/starred{/owner}{/repo}", | |||||
| "subscriptions_url": "https://api.github.com/users/aaronpk/subscriptions", | |||||
| "organizations_url": "https://api.github.com/users/aaronpk/orgs", | |||||
| "repos_url": "https://api.github.com/users/aaronpk/repos", | |||||
| "events_url": "https://api.github.com/users/aaronpk/events{/privacy}", | |||||
| "received_events_url": "https://api.github.com/users/aaronpk/received_events", | |||||
| "type": "User", | |||||
| "site_admin": false | |||||
| }, | |||||
| "private": false, | |||||
| "html_url": "https://github.com/aaronpk/XRay", | |||||
| "description": "X-Ray returns structured data from any URL", | |||||
| "fork": false, | |||||
| "url": "https://api.github.com/repos/aaronpk/XRay", | |||||
| "forks_url": "https://api.github.com/repos/aaronpk/XRay/forks", | |||||
| "keys_url": "https://api.github.com/repos/aaronpk/XRay/keys{/key_id}", | |||||
| "collaborators_url": "https://api.github.com/repos/aaronpk/XRay/collaborators{/collaborator}", | |||||
| "teams_url": "https://api.github.com/repos/aaronpk/XRay/teams", | |||||
| "hooks_url": "https://api.github.com/repos/aaronpk/XRay/hooks", | |||||
| "issue_events_url": "https://api.github.com/repos/aaronpk/XRay/issues/events{/number}", | |||||
| "events_url": "https://api.github.com/repos/aaronpk/XRay/events", | |||||
| "assignees_url": "https://api.github.com/repos/aaronpk/XRay/assignees{/user}", | |||||
| "branches_url": "https://api.github.com/repos/aaronpk/XRay/branches{/branch}", | |||||
| "tags_url": "https://api.github.com/repos/aaronpk/XRay/tags", | |||||
| "blobs_url": "https://api.github.com/repos/aaronpk/XRay/git/blobs{/sha}", | |||||
| "git_tags_url": "https://api.github.com/repos/aaronpk/XRay/git/tags{/sha}", | |||||
| "git_refs_url": "https://api.github.com/repos/aaronpk/XRay/git/refs{/sha}", | |||||
| "trees_url": "https://api.github.com/repos/aaronpk/XRay/git/trees{/sha}", | |||||
| "statuses_url": "https://api.github.com/repos/aaronpk/XRay/statuses/{sha}", | |||||
| "languages_url": "https://api.github.com/repos/aaronpk/XRay/languages", | |||||
| "stargazers_url": "https://api.github.com/repos/aaronpk/XRay/stargazers", | |||||
| "contributors_url": "https://api.github.com/repos/aaronpk/XRay/contributors", | |||||
| "subscribers_url": "https://api.github.com/repos/aaronpk/XRay/subscribers", | |||||
| "subscription_url": "https://api.github.com/repos/aaronpk/XRay/subscription", | |||||
| "commits_url": "https://api.github.com/repos/aaronpk/XRay/commits{/sha}", | |||||
| "git_commits_url": "https://api.github.com/repos/aaronpk/XRay/git/commits{/sha}", | |||||
| "comments_url": "https://api.github.com/repos/aaronpk/XRay/comments{/number}", | |||||
| "issue_comment_url": "https://api.github.com/repos/aaronpk/XRay/issues/comments{/number}", | |||||
| "contents_url": "https://api.github.com/repos/aaronpk/XRay/contents/{+path}", | |||||
| "compare_url": "https://api.github.com/repos/aaronpk/XRay/compare/{base}...{head}", | |||||
| "merges_url": "https://api.github.com/repos/aaronpk/XRay/merges", | |||||
| "archive_url": "https://api.github.com/repos/aaronpk/XRay/{archive_format}{/ref}", | |||||
| "downloads_url": "https://api.github.com/repos/aaronpk/XRay/downloads", | |||||
| "issues_url": "https://api.github.com/repos/aaronpk/XRay/issues{/number}", | |||||
| "pulls_url": "https://api.github.com/repos/aaronpk/XRay/pulls{/number}", | |||||
| "milestones_url": "https://api.github.com/repos/aaronpk/XRay/milestones{/number}", | |||||
| "notifications_url": "https://api.github.com/repos/aaronpk/XRay/notifications{?since,all,participating}", | |||||
| "labels_url": "https://api.github.com/repos/aaronpk/XRay/labels{/name}", | |||||
| "releases_url": "https://api.github.com/repos/aaronpk/XRay/releases{/id}", | |||||
| "deployments_url": "https://api.github.com/repos/aaronpk/XRay/deployments", | |||||
| "created_at": "2016-02-19T16:53:20Z", | |||||
| "updated_at": "2017-03-02T18:36:20Z", | |||||
| "pushed_at": "2017-04-19T16:22:04Z", | |||||
| "git_url": "git://github.com/aaronpk/XRay.git", | |||||
| "ssh_url": "git@github.com:aaronpk/XRay.git", | |||||
| "clone_url": "https://github.com/aaronpk/XRay.git", | |||||
| "svn_url": "https://github.com/aaronpk/XRay", | |||||
| "homepage": "https://xray.p3k.io", | |||||
| "size": 2189, | |||||
| "stargazers_count": 17, | |||||
| "watchers_count": 17, | |||||
| "language": "PHP", | |||||
| "has_issues": true, | |||||
| "has_projects": true, | |||||
| "has_downloads": true, | |||||
| "has_wiki": false, | |||||
| "has_pages": false, | |||||
| "forks_count": 2, | |||||
| "mirror_url": null, | |||||
| "open_issues_count": 14, | |||||
| "forks": 2, | |||||
| "open_issues": 14, | |||||
| "watchers": 17, | |||||
| "default_branch": "master", | |||||
| "network_count": 2, | |||||
| "subscribers_count": 10 | |||||
| } | |||||
| @ -0,0 +1,71 @@ | |||||
| HTTP/1.1 200 OK | |||||
| Server: GitHub.com | |||||
| Date: Fri, 21 Apr 2017 15:57:52 GMT | |||||
| Content-Type: application/json; charset=utf-8 | |||||
| Content-Length: 2188 | |||||
| Status: 200 OK | |||||
| X-RateLimit-Limit: 60 | |||||
| X-RateLimit-Remaining: 51 | |||||
| X-RateLimit-Reset: 1492790890 | |||||
| Cache-Control: public, max-age=60, s-maxage=60 | |||||
| Vary: Accept | |||||
| ETag: "9bd5ea8062c126b9d42f9b86b74337e5" | |||||
| Last-Modified: Tue, 11 Apr 2017 10:12:57 GMT | |||||
| X-GitHub-Media-Type: github.v3; format=json | |||||
| Access-Control-Expose-Headers: ETag, Link, X-GitHub-OTP, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset, X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Poll-Interval | |||||
| Access-Control-Allow-Origin: * | |||||
| Content-Security-Policy: default-src 'none' | |||||
| Strict-Transport-Security: max-age=31536000; includeSubdomains; preload | |||||
| X-Content-Type-Options: nosniff | |||||
| X-Frame-Options: deny | |||||
| X-XSS-Protection: 1; mode=block | |||||
| Vary: Accept-Encoding | |||||
| X-Served-By: 15bc4ab707db6d6b474783868c7cc828 | |||||
| X-GitHub-Request-Id: CE5A:2FD1:1A1AFDC:209084E:58FA2C00 | |||||
| { | |||||
| "url": "https://api.github.com/repos/aaronpk/XRay/issues/25", | |||||
| "repository_url": "https://api.github.com/repos/aaronpk/XRay", | |||||
| "labels_url": "https://api.github.com/repos/aaronpk/XRay/issues/25/labels{/name}", | |||||
| "comments_url": "https://api.github.com/repos/aaronpk/XRay/issues/25/comments", | |||||
| "events_url": "https://api.github.com/repos/aaronpk/XRay/issues/25/events", | |||||
| "html_url": "https://github.com/aaronpk/XRay/issues/25", | |||||
| "id": 203380820, | |||||
| "number": 25, | |||||
| "title": "Post type discovery", | |||||
| "user": { | |||||
| "login": "sebsel", | |||||
| "id": 16517999, | |||||
| "avatar_url": "https://avatars3.githubusercontent.com/u/16517999?v=3", | |||||
| "gravatar_id": "", | |||||
| "url": "https://api.github.com/users/sebsel", | |||||
| "html_url": "https://github.com/sebsel", | |||||
| "followers_url": "https://api.github.com/users/sebsel/followers", | |||||
| "following_url": "https://api.github.com/users/sebsel/following{/other_user}", | |||||
| "gists_url": "https://api.github.com/users/sebsel/gists{/gist_id}", | |||||
| "starred_url": "https://api.github.com/users/sebsel/starred{/owner}{/repo}", | |||||
| "subscriptions_url": "https://api.github.com/users/sebsel/subscriptions", | |||||
| "organizations_url": "https://api.github.com/users/sebsel/orgs", | |||||
| "repos_url": "https://api.github.com/users/sebsel/repos", | |||||
| "events_url": "https://api.github.com/users/sebsel/events{/privacy}", | |||||
| "received_events_url": "https://api.github.com/users/sebsel/received_events", | |||||
| "type": "User", | |||||
| "site_admin": false | |||||
| }, | |||||
| "labels": [ | |||||
| ], | |||||
| "state": "open", | |||||
| "locked": false, | |||||
| "assignee": null, | |||||
| "assignees": [ | |||||
| ], | |||||
| "milestone": null, | |||||
| "comments": 3, | |||||
| "created_at": "2017-01-26T14:13:42Z", | |||||
| "updated_at": "2017-01-29T17:59:31Z", | |||||
| "closed_at": null, | |||||
| "body": "I don't know if this is the right place, but since I was trying to capture some of php-comments shortcomings, here is a shortcoming of XRay I found :)\r\n\r\n> sebsel a thing to note: php-comments gives a 'type' with values like 'reply' and 'like', but XRay just gives 'type=entry' with a 'like-of'. So they do different things.\r\nhttps://chat.indieweb.org/dev/2017-01-02#t1483372296121000\r\n\r\nhttps://www.w3.org/TR/post-type-discovery/", | |||||
| "closed_by": null | |||||
| } | |||||
| @ -0,0 +1,53 @@ | |||||
| HTTP/1.1 200 OK | |||||
| Server: GitHub.com | |||||
| Date: Sat, 22 Apr 2017 20:45:04 GMT | |||||
| Content-Type: application/json; charset=utf-8 | |||||
| Content-Length: 3408 | |||||
| Status: 200 OK | |||||
| X-RateLimit-Limit: 60 | |||||
| X-RateLimit-Remaining: 58 | |||||
| X-RateLimit-Reset: 1492894908 | |||||
| Cache-Control: public, max-age=60, s-maxage=60 | |||||
| Vary: Accept | |||||
| ETag: "fc180b8dec148356f2bfb61fd5b1a7c8" | |||||
| Last-Modified: Tue, 11 Apr 2017 10:12:57 GMT | |||||
| X-GitHub-Media-Type: github.v3; format=json | |||||
| Access-Control-Expose-Headers: ETag, Link, X-GitHub-OTP, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset, X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Poll-Interval | |||||
| Access-Control-Allow-Origin: * | |||||
| Content-Security-Policy: default-src 'none' | |||||
| Strict-Transport-Security: max-age=31536000; includeSubdomains; preload | |||||
| X-Content-Type-Options: nosniff | |||||
| X-Frame-Options: deny | |||||
| X-XSS-Protection: 1; mode=block | |||||
| Vary: Accept-Encoding | |||||
| X-Served-By: 46808ddc41c302090177e58148908b23 | |||||
| X-GitHub-Request-Id: CA6A:2FD0:280B9D7:3215E95:58FBC0CF | |||||
| { | |||||
| "url": "https://api.github.com/repos/aaronpk/XRay/issues/comments/275433926", | |||||
| "html_url": "https://github.com/aaronpk/XRay/issues/25#issuecomment-275433926", | |||||
| "issue_url": "https://api.github.com/repos/aaronpk/XRay/issues/25", | |||||
| "id": 275433926, | |||||
| "user": { | |||||
| "login": "sebsel", | |||||
| "id": 16517999, | |||||
| "avatar_url": "https://avatars3.githubusercontent.com/u/16517999?v=3", | |||||
| "gravatar_id": "", | |||||
| "url": "https://api.github.com/users/sebsel", | |||||
| "html_url": "https://github.com/sebsel", | |||||
| "followers_url": "https://api.github.com/users/sebsel/followers", | |||||
| "following_url": "https://api.github.com/users/sebsel/following{/other_user}", | |||||
| "gists_url": "https://api.github.com/users/sebsel/gists{/gist_id}", | |||||
| "starred_url": "https://api.github.com/users/sebsel/starred{/owner}{/repo}", | |||||
| "subscriptions_url": "https://api.github.com/users/sebsel/subscriptions", | |||||
| "organizations_url": "https://api.github.com/users/sebsel/orgs", | |||||
| "repos_url": "https://api.github.com/users/sebsel/repos", | |||||
| "events_url": "https://api.github.com/users/sebsel/events{/privacy}", | |||||
| "received_events_url": "https://api.github.com/users/sebsel/received_events", | |||||
| "type": "User", | |||||
| "site_admin": false | |||||
| }, | |||||
| "created_at": "2017-01-26T16:24:37Z", | |||||
| "updated_at": "2017-01-29T17:59:31Z", | |||||
| "body": "Well it's just that php-comments does more than XRay does currently. But that's no good reason.\r\n\r\nThinking about it: yes, I actually use this.\r\nhttps://indieweb.org/facepile#Sebastiaan_Andeweg\r\n\r\nMy webmentions are sorted by the type-field from php-comments. (That's how the plugin originally worked.) I use it to display in the facepile, with proper icon, or as a comment below it.\r\n\r\nOf course I can write my own logic for it, which I did today to sort my own posts in my indexing database. I had enough of writing checks like that all the time, and creating separate bool fields in my database table. (An entry with a name is an article, but a bookmark with a name is no article.)\r\nThe database-example is NOT a use case for XRay though.\r\n\r\nBelow is my current $page->postType() method (in Kirby), including commented-out things that I don't use, but found on the wiki.\r\n\r\n```php\r\n public function postType() {\r\n if($this->has('like_of')) return 'like';\r\n if($this->has('bookmark_of')) return 'bookmark';\r\n //if($this->has('tag_of')) return 'tag';\r\n if($this->has('repost_of')) return 'repost';\r\n if($this->has('read_of')) return 'read'; // << haven't implemented myself, now\r\n if($this->has('watch_of')) return 'watch'; // << posting as text notes, but I have them!\r\n if($this->has('checkin')) return 'checkin';\r\n //if($this->has('invitee')) return 'invitation';\r\n if($this->has('rsvp')) return 'rsvp';\r\n if($this->has('in_reply_to')) return 'reply';\r\n if($this->type() == 'event') return 'event';\r\n if($this->type() == 'review') return 'review';\r\n if($this->has('wrote')) return 'wrote'; // << is one is for myself only :/\r\n if($this->has('video')) return 'video';\r\n if($this->has('photo')) return 'photo';\r\n if($this->has('name')) return 'article';\r\n if($this->has('text')) return 'note'; // << 'text' = 'content'\r\n return 'entry';\r\n }\r\n```\r\n\r\nOh, and I totally agree on keeping 'type' for Mf2 :)" | |||||
| } | |||||
| @ -0,0 +1,77 @@ | |||||
| HTTP/1.1 200 OK | |||||
| Server: GitHub.com | |||||
| Date: Fri, 21 Apr 2017 15:08:10 GMT | |||||
| Content-Type: application/json; charset=utf-8 | |||||
| Content-Length: 2415 | |||||
| Status: 200 OK | |||||
| X-RateLimit-Limit: 60 | |||||
| X-RateLimit-Remaining: 59 | |||||
| X-RateLimit-Reset: 1492790890 | |||||
| Cache-Control: public, max-age=60, s-maxage=60 | |||||
| Vary: Accept | |||||
| ETag: "8bb1e470c72305c381e9c1cf336f960f" | |||||
| Last-Modified: Thu, 20 Apr 2017 12:55:34 GMT | |||||
| X-GitHub-Media-Type: github.v3; format=json | |||||
| Access-Control-Expose-Headers: ETag, Link, X-GitHub-OTP, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset, X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Poll-Interval | |||||
| Access-Control-Allow-Origin: * | |||||
| Content-Security-Policy: default-src 'none' | |||||
| Strict-Transport-Security: max-age=31536000; includeSubdomains; preload | |||||
| X-Content-Type-Options: nosniff | |||||
| X-Frame-Options: deny | |||||
| X-XSS-Protection: 1; mode=block | |||||
| Vary: Accept-Encoding | |||||
| X-Served-By: e14705a23c085afeff5e104b1fc3922a | |||||
| X-GitHub-Request-Id: F706:2FD1:1984FFC:1FD658F:58FA2059 | |||||
| { | |||||
| "url": "https://api.github.com/repos/idno/Known/issues/1690", | |||||
| "repository_url": "https://api.github.com/repos/idno/Known", | |||||
| "labels_url": "https://api.github.com/repos/idno/Known/issues/1690/labels{/name}", | |||||
| "comments_url": "https://api.github.com/repos/idno/Known/issues/1690/comments", | |||||
| "events_url": "https://api.github.com/repos/idno/Known/issues/1690/events", | |||||
| "html_url": "https://github.com/idno/Known/pull/1690", | |||||
| "id": 220719149, | |||||
| "number": 1690, | |||||
| "title": "fixes bookmark Microformats markup", | |||||
| "user": { | |||||
| "login": "aaronpk", | |||||
| "id": 113001, | |||||
| "avatar_url": "https://avatars2.githubusercontent.com/u/113001?v=3", | |||||
| "gravatar_id": "", | |||||
| "url": "https://api.github.com/users/aaronpk", | |||||
| "html_url": "https://github.com/aaronpk", | |||||
| "followers_url": "https://api.github.com/users/aaronpk/followers", | |||||
| "following_url": "https://api.github.com/users/aaronpk/following{/other_user}", | |||||
| "gists_url": "https://api.github.com/users/aaronpk/gists{/gist_id}", | |||||
| "starred_url": "https://api.github.com/users/aaronpk/starred{/owner}{/repo}", | |||||
| "subscriptions_url": "https://api.github.com/users/aaronpk/subscriptions", | |||||
| "organizations_url": "https://api.github.com/users/aaronpk/orgs", | |||||
| "repos_url": "https://api.github.com/users/aaronpk/repos", | |||||
| "events_url": "https://api.github.com/users/aaronpk/events{/privacy}", | |||||
| "received_events_url": "https://api.github.com/users/aaronpk/received_events", | |||||
| "type": "User", | |||||
| "site_admin": false | |||||
| }, | |||||
| "labels": [ | |||||
| ], | |||||
| "state": "open", | |||||
| "locked": false, | |||||
| "assignee": null, | |||||
| "assignees": [ | |||||
| ], | |||||
| "milestone": null, | |||||
| "comments": 0, | |||||
| "created_at": "2017-04-10T17:44:57Z", | |||||
| "updated_at": "2017-04-20T12:55:34Z", | |||||
| "closed_at": null, | |||||
| "pull_request": { | |||||
| "url": "https://api.github.com/repos/idno/Known/pulls/1690", | |||||
| "html_url": "https://github.com/idno/Known/pull/1690", | |||||
| "diff_url": "https://github.com/idno/Known/pull/1690.diff", | |||||
| "patch_url": "https://github.com/idno/Known/pull/1690.patch" | |||||
| }, | |||||
| "body": "## Here's what I fixed or added:\r\n\r\nI updated the bookmark template to use `u-bookmark-of` instead of `p-bookmark`. This fixes the parsed version of bookmark posts.\r\n\r\n## Here's why I did it:\r\n\r\nThe bookmark Microformats were setting only the plaintext `bookmark` property which caused bookmarks to not actually reference the URL they are bookmarks of.\r\n", | |||||
| "closed_by": null | |||||
| } | |||||
| @ -0,0 +1,57 @@ | |||||
| HTTP/1.1 200 OK | |||||
| Server: GitHub.com | |||||
| Date: Fri, 21 Apr 2017 15:41:52 GMT | |||||
| Content-Type: application/json; charset=utf-8 | |||||
| Content-Length: 1275 | |||||
| Status: 200 OK | |||||
| X-RateLimit-Limit: 60 | |||||
| X-RateLimit-Remaining: 57 | |||||
| X-RateLimit-Reset: 1492790890 | |||||
| Cache-Control: public, max-age=60, s-maxage=60 | |||||
| Vary: Accept | |||||
| ETag: "7c20a2777e3c14616a18c07f4b8f8b64" | |||||
| Last-Modified: Tue, 18 Apr 2017 22:02:28 GMT | |||||
| X-GitHub-Media-Type: github.v3; format=json | |||||
| Access-Control-Expose-Headers: ETag, Link, X-GitHub-OTP, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset, X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Poll-Interval | |||||
| Access-Control-Allow-Origin: * | |||||
| Content-Security-Policy: default-src 'none' | |||||
| Strict-Transport-Security: max-age=31536000; includeSubdomains; preload | |||||
| X-Content-Type-Options: nosniff | |||||
| X-Frame-Options: deny | |||||
| X-XSS-Protection: 1; mode=block | |||||
| Vary: Accept-Encoding | |||||
| X-Served-By: d0b3c2c33a23690498aa8e70a435a259 | |||||
| X-GitHub-Request-Id: C713:2FD0:192EF2D:1F4D147:58FA2840 | |||||
| { | |||||
| "login": "aaronpk", | |||||
| "id": 113001, | |||||
| "avatar_url": "https://avatars2.githubusercontent.com/u/113001?v=3", | |||||
| "gravatar_id": "", | |||||
| "url": "https://api.github.com/users/aaronpk", | |||||
| "html_url": "https://github.com/aaronpk", | |||||
| "followers_url": "https://api.github.com/users/aaronpk/followers", | |||||
| "following_url": "https://api.github.com/users/aaronpk/following{/other_user}", | |||||
| "gists_url": "https://api.github.com/users/aaronpk/gists{/gist_id}", | |||||
| "starred_url": "https://api.github.com/users/aaronpk/starred{/owner}{/repo}", | |||||
| "subscriptions_url": "https://api.github.com/users/aaronpk/subscriptions", | |||||
| "organizations_url": "https://api.github.com/users/aaronpk/orgs", | |||||
| "repos_url": "https://api.github.com/users/aaronpk/repos", | |||||
| "events_url": "https://api.github.com/users/aaronpk/events{/privacy}", | |||||
| "received_events_url": "https://api.github.com/users/aaronpk/received_events", | |||||
| "type": "User", | |||||
| "site_admin": false, | |||||
| "name": "Aaron Parecki", | |||||
| "company": null, | |||||
| "blog": "https://aaronparecki.com", | |||||
| "location": "Portland, OR", | |||||
| "email": "aaron@parecki.com", | |||||
| "hireable": null, | |||||
| "bio": null, | |||||
| "public_repos": 217, | |||||
| "public_gists": 143, | |||||
| "followers": 785, | |||||
| "following": 51, | |||||
| "created_at": "2009-08-07T18:27:56Z", | |||||
| "updated_at": "2017-04-18T22:02:28Z" | |||||
| } | |||||
| @ -0,0 +1,57 @@ | |||||
| HTTP/1.1 200 OK | |||||
| Server: GitHub.com | |||||
| Date: Sat, 22 Apr 2017 20:46:05 GMT | |||||
| Content-Type: application/json; charset=utf-8 | |||||
| Content-Length: 1258 | |||||
| Status: 200 OK | |||||
| X-RateLimit-Limit: 60 | |||||
| X-RateLimit-Remaining: 57 | |||||
| X-RateLimit-Reset: 1492894908 | |||||
| Cache-Control: public, max-age=60, s-maxage=60 | |||||
| Vary: Accept | |||||
| ETag: "525266177afd22f738e334958dedfc8f" | |||||
| Last-Modified: Tue, 11 Apr 2017 10:12:57 GMT | |||||
| X-GitHub-Media-Type: github.v3; format=json | |||||
| Access-Control-Expose-Headers: ETag, Link, X-GitHub-OTP, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset, X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Poll-Interval | |||||
| Access-Control-Allow-Origin: * | |||||
| Content-Security-Policy: default-src 'none' | |||||
| Strict-Transport-Security: max-age=31536000; includeSubdomains; preload | |||||
| X-Content-Type-Options: nosniff | |||||
| X-Frame-Options: deny | |||||
| X-XSS-Protection: 1; mode=block | |||||
| Vary: Accept-Encoding | |||||
| X-Served-By: eef8b8685a106934dcbb4b7c59fba0bf | |||||
| X-GitHub-Request-Id: CAE2:2FD0:280DE43:3218CDC:58FBC10C | |||||
| { | |||||
| "login": "sebsel", | |||||
| "id": 16517999, | |||||
| "avatar_url": "https://avatars3.githubusercontent.com/u/16517999?v=3", | |||||
| "gravatar_id": "", | |||||
| "url": "https://api.github.com/users/sebsel", | |||||
| "html_url": "https://github.com/sebsel", | |||||
| "followers_url": "https://api.github.com/users/sebsel/followers", | |||||
| "following_url": "https://api.github.com/users/sebsel/following{/other_user}", | |||||
| "gists_url": "https://api.github.com/users/sebsel/gists{/gist_id}", | |||||
| "starred_url": "https://api.github.com/users/sebsel/starred{/owner}{/repo}", | |||||
| "subscriptions_url": "https://api.github.com/users/sebsel/subscriptions", | |||||
| "organizations_url": "https://api.github.com/users/sebsel/orgs", | |||||
| "repos_url": "https://api.github.com/users/sebsel/repos", | |||||
| "events_url": "https://api.github.com/users/sebsel/events{/privacy}", | |||||
| "received_events_url": "https://api.github.com/users/sebsel/received_events", | |||||
| "type": "User", | |||||
| "site_admin": false, | |||||
| "name": "Sebastiaan Andeweg", | |||||
| "company": null, | |||||
| "blog": "https://seblog.nl/", | |||||
| "location": "Nijmegen, The Netherlands", | |||||
| "email": null, | |||||
| "hireable": null, | |||||
| "bio": null, | |||||
| "public_repos": 16, | |||||
| "public_gists": 2, | |||||
| "followers": 5, | |||||
| "following": 3, | |||||
| "created_at": "2016-01-02T15:39:15Z", | |||||
| "updated_at": "2017-04-11T10:12:57Z" | |||||
| } | |||||