123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164 |
- <?php
- class GitHubGistBridge extends BridgeAbstract {
- const NAME = 'GitHubGist comment bridge';
- const URI = 'https://gist.github.com';
- const DESCRIPTION = 'Generates feeds for Gist comments';
- const MAINTAINER = 'logmanoriginal';
- const CACHE_TIMEOUT = 3600;
- const PARAMETERS = array(array(
- 'id' => array(
- 'name' => 'Gist',
- 'type' => 'text',
- 'required' => true,
- 'title' => 'Insert Gist ID or URI',
- 'exampleValue' => '2646763, https://gist.github.com/2646763'
- )
- ));
- private $filename;
- public function getURI() {
- $id = $this->getInput('id') ?: '';
- $urlpath = parse_url($id, PHP_URL_PATH);
- if($urlpath) {
- $components = explode('/', $urlpath);
- $id = end($components);
- }
- return static::URI . '/' . $id;
- }
- public function getName() {
- return $this->filename ? $this->filename . ' - ' . static::NAME : static::NAME;
- }
- public function collectData() {
- $html = getSimpleHTMLDOM($this->getURI(),
- null,
- null,
- true,
- true,
- DEFAULT_TARGET_CHARSET,
- false, // Do NOT remove line breaks
- DEFAULT_BR_TEXT,
- DEFAULT_SPAN_TEXT)
- or returnServerError('Could not request ' . $this->getURI());
- $html = defaultLinkTo($html, static::URI);
- $fileinfo = $html->find('[class="file-info"]', 0)
- or returnServerError('Could not find file info!');
- $this->filename = $fileinfo->plaintext;
- $comments = $html->find('div[class="timeline-comment-wrapper"]');
- if(is_null($comments)) { // no comments yet
- return;
- }
- foreach($comments as $comment) {
- $uri = $comment->find('a[href^=#gistcomment]', 0)
- or returnServerError('Could not find comment anchor!');
- $title = $comment->find('div[class="unminimized-comment"] h3[class="timeline-comment-header-text"]', 0)
- or returnServerError('Could not find comment header text!');
- $datetime = $comment->find('[datetime]', 0)
- or returnServerError('Could not find comment datetime!');
- $author = $comment->find('a.author', 0)
- or returnServerError('Could not find author name!');
- $message = $comment->find('[class="comment-body"]', 0)
- or returnServerError('Could not find comment body!');
- $item = array();
- $item['uri'] = $this->getURI() . $uri->href;
- $item['title'] = str_replace('commented', 'commented on', $title->plaintext);
- $item['timestamp'] = strtotime($datetime->datetime);
- $item['author'] = '<a href="' . $author->href . '">' . $author->plaintext . '</a>';
- $item['content'] = $this->fixContent($message);
- // $item['enclosures'] = array();
- // $item['categories'] = array();
- $this->items[] = $item;
- }
- }
- /** Removes all unnecessary tags and adds formatting */
- private function fixContent($content){
- // Restore code (inside <pre />) highlighting
- foreach($content->find('pre') as $pre) {
- $pre->style = <<<EOD
- padding: 16px;
- overflow: auto;
- font-size: 85%;
- line-height: 1.45;
- background-color: #f6f8fa;
- border-radius: 3px;
- word-wrap: normal;
- box-sizing: border-box;
- margin-bottom: 16px;
- EOD;
- $code = $pre->find('code', 0);
- if($code) {
- $code->style = <<<EOD
- white-space: pre;
- word-break: normal;
- EOD;
- }
- }
- // find <code /> not inside <pre /> (`inline-code`)
- foreach($content->find('code') as $code) {
- if($code->parent()->tag === 'pre') {
- continue;
- }
- $code->style = <<<EOD
- background-color: rgba(27,31,35,0.05);
- padding: 0.2em 0.4em;
- border-radius: 3px;
- EOD;
- }
- // restore text spacing
- foreach($content->find('p') as $p) {
- $p->style = 'margin-bottom: 16px;';
- }
- // Remove unnecessary tags
- $content = strip_tags(
- $content->innertext,
- '<p><a><img><ol><ul><li><table><tr><th><td><string><pre><code><br><hr><h>'
- );
- return $content;
- }
- }
|