1 <?php
2 /**
3  * RSS Syntax Plugin: display feeds in your wiki.
4  *
5  * @author Algorys
6  */
7 
8 if (!defined('DOKU_INC')) die();
9 
10 class syntax_plugin_rss extends DokuWiki_Syntax_Plugin {
11 
12     public function getType() {
13         return 'container';
14     }
15 
16     /**
17     * @return string Paragraph type
18     **/
19 
20     public function getPType() {
21         return 'normal';
22     }
23 
24     // Keep syntax inside plugin
25     function getAllowedTypes() {
26 	    return array('container', 'baseonly', 'substition','protected','disabled','formatting','paragraphs');
27     }
28 
29     public function getSort() {
30         return 198;
31     }
32 
33     function connectTo($mode) {
34             $this->Lexer->addSpecialPattern('<rss[^>]*>(?=.*)', $mode,'plugin_rss');
35     }
36 
37 
38 /**
39 * Do the regexp
40 **/
41     function handle($match, $state, $pos, Doku_Handler $handler) {
42         switch($state){
43             case DOKU_LEXER_SPECIAL :
44             case DOKU_LEXER_ENTER :
45                 $data = array(
46                         'state'=>$state,
47                         'feed'=> "",
48                     );
49                 // Looking for id
50                 preg_match("/feed *= *(['\"])(.*?)\\1/", $match, $feed);
51                 if( count($feed) != 0 ) {
52                     $data['feed'] = $feed[2];
53                 }
54                 return $data;
55             case DOKU_LEXER_UNMATCHED :
56                 return array('state'=>$state, 'text'=>$match);
57             default:
58                 return array('state'=>$state, 'bytepos_end' => $pos + strlen($match));
59          }
60     }
61 
62     function _check_rss($data) {
63         $feed = $data['feed'];
64         try {
65             if(!@$fluxrss=simplexml_load_file($feed)) {
66                 throw new Exception('Flux invalide');
67             }
68             if(empty($fluxrss->channel->title) || empty($fluxrss->channel->description) || empty($fluxrss->channel->item->title)) {
69                 throw new Exception('Invalid Feed !');
70             }
71             //$renderer->doc .= '<p>Flux RSS trouvé !</p>';
72         } catch(Exception $e){
73             echo $e->getMessage();
74         }
75         return $fluxrss;
76     }
77 
78     function _render_rss($renderer, $data){
79         $fluxrss = $this->_check_rss($data);
80         if($fluxrss) {
81             $renderer->doc .= '<img src="lib/plugins/rss/images/rss.png" alt="rss" class="rss">';
82             $renderer->doc .= '<h3>'.(string)$fluxrss->channel->title.'</h3>';
83             $renderer->doc .= '<p>'.(string)$fluxrss->channel->description.'</p>';
84             $i = 0;
85             $nb_to_display = 5;
86             $renderer->doc .= '<ul>';
87             foreach($fluxrss->channel->item as $item) {
88                 $renderer->doc .= '<li>';
89                 $renderer->doc .= '<a href="'.(string)$item->link.'">'.(string)$item->title.'</a>';
90                 $renderer->doc .= '<i> &#9998 '.$this->getLang('rss.publish').' '.(string)date('G\hi, d/m/Y', strtotime($item->pubDate)).'</i>';
91                 $renderer->doc .= '</li>';
92                 if(++$i>=$nb_to_display)
93                     break;
94             }
95         }else {
96             $renderer->doc .= '<p>'.$this->getLang('rss.empty').' </p>';
97         }
98     }
99 
100     // Dokuwiki Renderer
101     function render($mode, Doku_Renderer $renderer, $data) {
102         if($mode != 'xhtml') return false;
103 
104         if($data['error']) {
105             $renderer->doc .= $data['text'];
106             return true;
107         }
108         $renderer->info['cache'] = false;
109         switch($data['state']) {
110             case DOKU_LEXER_SPECIAL :
111             case DOKU_LEXER_ENTER :
112                 $this->_render_rss($renderer, $data);
113                 break;
114             case DOKU_LEXER_UNMATCHED :
115                 $renderer->doc .= $renderer->_xmlEntities($data['text']);
116                 break;
117         }
118         return true;
119     }
120 
121 }
122