123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152 |
- <?php
- class KernelBugTrackerBridge extends BridgeAbstract {
- const NAME = 'Kernel Bug Tracker';
- const URI = 'https://bugzilla.kernel.org';
- const DESCRIPTION = 'Returns feeds for bug comments';
- const MAINTAINER = 'logmanoriginal';
- const PARAMETERS = array(
- 'Bug comments' => array(
- 'id' => array(
- 'name' => 'Bug tracking ID',
- 'type' => 'number',
- 'required' => true,
- 'title' => 'Insert bug tracking ID',
- 'exampleValue' => 121241
- ),
- 'limit' => array(
- 'name' => 'Number of comments to return',
- 'type' => 'number',
- 'required' => false,
- 'title' => 'Specify number of comments to return',
- 'defaultValue' => -1
- ),
- 'sorting' => array(
- 'name' => 'Sorting',
- 'type' => 'list',
- 'required' => false,
- 'title' => 'Defines the sorting order of the comments returned',
- 'defaultValue' => 'of',
- 'values' => array(
- 'Oldest first' => 'of',
- 'Latest first' => 'lf'
- )
- )
- )
- );
- private $bugid = '';
- private $bugdesc = '';
- public function collectData(){
- $limit = $this->getInput('limit');
- $sorting = $this->getInput('sorting');
- // We use the print preview page for simplicity
- $html = getSimpleHTMLDOMCached($this->getURI() . '&format=multiple',
- 86400,
- false,
- null,
- 0,
- null,
- true,
- true,
- DEFAULT_TARGET_CHARSET,
- false, // Do NOT remove line breaks
- DEFAULT_BR_TEXT,
- DEFAULT_SPAN_TEXT);
- if($html === false)
- returnServerError('Failed to load page!');
- // Store header information into private members
- $this->bugid = $html->find('#bugzilla-body', 0)->find('a', 0)->innertext;
- $this->bugdesc = $html->find('table.bugfields', 0)->find('tr', 0)->find('td', 0)->innertext;
- // Get and limit comments
- $comments = $html->find('div.bz_comment');
- if($limit > 0 && count($comments) > $limit) {
- $comments = array_slice($comments, count($comments) - $limit, $limit);
- }
- // Order comments
- switch($sorting) {
- case 'lf': $comments = array_reverse($comments, true);
- case 'of':
- default: // Nothing to do, keep original order
- }
- foreach($comments as $comment) {
- $comment = $this->inlineStyles($comment);
- $item = array();
- $item['uri'] = $this->getURI() . '#' . $comment->id;
- $item['author'] = $comment->find('span.bz_comment_user', 0)->innertext;
- $item['title'] = $comment->find('span.bz_comment_number', 0)->find('a', 0)->innertext;
- $item['timestamp'] = strtotime($comment->find('span.bz_comment_time', 0)->innertext);
- $item['content'] = $comment->find('pre.bz_comment_text', 0)->innertext;
- // Fix line breaks (they use LF)
- $item['content'] = str_replace("\n", '<br>', $item['content']);
- // Fix relative URIs
- $item['content'] = $this->replaceRelativeURI($item['content']);
- $this->items[] = $item;
- }
- }
- public function getURI(){
- switch($this->queriedContext) {
- case 'Bug comments':
- return parent::getURI()
- . '/show_bug.cgi?id='
- . $this->getInput('id');
- break;
- default: return parent::getURI();
- }
- }
- public function getName(){
- switch($this->queriedContext) {
- case 'Bug comments':
- return 'Bug '
- . $this->bugid
- . ' tracker for '
- . $this->bugdesc
- . ' - '
- . parent::getName();
- break;
- default: return parent::getName();
- }
- }
- /**
- * Replaces all relative URIs with absolute ones
- *
- * @param string $content The source string
- * @return string Returns the source string with all relative URIs replaced
- * by absolute ones.
- */
- private function replaceRelativeURI($content){
- return preg_replace('/href="(?!http)/', 'href="' . self::URI . '/', $content);
- }
- /**
- * Adds styles as attributes to tags with known classes
- *
- * @param object $html A simplehtmldom object
- * @return object Returns the original object with styles added as
- * attributes.
- */
- private function inlineStyles($html){
- foreach($html->find('.bz_obsolete') as $element) {
- $element->style = 'text-decoration:line-through;';
- }
- return $html;
- }
- }
|