| @ -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" | |||
| } | |||