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