]> CyberLeo.Net >> Repos - SourceForge/phpwiki.git/blob - lib/plugin/FoafViewer.php
Normalize header
[SourceForge/phpwiki.git] / lib / plugin / FoafViewer.php
1 <?php
2 rcs_id('$Id$');
3 /*
4  * Copyright (C) 2004 $ThePhpWikiProgrammingTeam
5  * 
6  * This file is part of PhpWiki.
7  *
8  * PhpWiki is free software; you can redistribute it and/or modify
9  * it under the terms of the GNU General Public License as published by
10  * the Free Software Foundation; either version 2 of the License, or
11  * (at your option) any later version.
12  *
13  * PhpWiki is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16  * GNU General Public License for more details.
17  *
18  * You should have received a copy of the GNU General Public License
19  * along with PhpWiki; if not, write to the Free Software
20  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
21  */
22
23 /**
24 * Basic FoafViewPlugin for PHPWiki.
25 *
26 * Please note; this is <em>heavily</em> based on an example file distributed with XML_FOAF 0.2
27 * HTTP GET vars:
28 * <kbd>foaf=uri</kbd> - Used to determine the URI of a FOAF file.
29 * <kbd>original=true</kbd> - Simply dumps contents of $foaf
30 *
31 * @author Daniel O'Connor <http://ahsonline.com.au/dod/FOAF.rdf>
32 * @author Davey Shafik <http://pear.php.net/user/davey>
33 * @date 2004-06-07
34 * @version 0.0.2
35 * @bug XML_FOAF 0.2 has problems with named RDF nodes (ie, http://www.ahsonline.com.au/dod/FOAF.rdf). 
36 *      Davey knows, will be fixing this soon.
37 * @todo "Friends" component
38 * @todo Named URLs (DC metadata)
39 * @todo "View in FOAFNAUT/foafexplorer/other"
40 * @bug Full name !available incorrectly handled.
41 */
42
43 /**
44  * FoafViewer:  Parse an RDF FOAF file and extract information to render as HTML
45  * usage:   &lt;?plugin FoafViewer foaf=http://www.ahsonline.com.au/dod/rawksuga.rdf original=true?&gt;
46  * author:  Daniel O'Connor <http://www.ahsonline.com.au/dod/FOAF.rdf>
47  * 
48  * phpwiki version based on version 0.0.2 by Daniel O'Connor
49  *
50  * TODO: 
51  *  - use a template.
52  *  - use the phpwiki internal user foaf data (stored by a UserPreferences extension)
53  *  - fix the pear FOAF Parser or we'll write our own (based on our XmlParser)
54  */
55 class WikiPlugin_FoafViewer
56 extends WikiPlugin
57 {
58     // The handler is handled okay. The only problem is that it still 
59     // throws a fatal.
60     function _error_handler($error) {
61         if (strstr($error->errstr,"Failed opening required 'XML/FOAF/Parser.php'"))
62             return true;
63         elseif (strstr($error->errstr,'No such file or directory'))
64             return true;
65         return false;
66     }
67
68     function getName() {
69         return _("FoafViewer");
70     }
71
72     function getDescription() {
73         return _("Parse an RDF FOAF file and extract information to render as HTML");
74     }
75
76     function getVersion() {
77         return preg_replace("/[Revision: $]/", '',
78                             "\$Revision$");
79     }
80
81     function getDefaultArguments() {
82         return array( 'foaf'     => false, // the URI to parse
83                       //'userid'   => false,
84                       'original' => false
85                       );
86     }
87                 
88     function run($dbi, $argstr, &$request, $basepage) {
89
90         /* ignore fatal on loading */
91         /*
92         global $ErrorManager;
93         $ErrorManager->pushErrorHandler(new WikiMethodCb($this,'_error_handler'));
94         */
95         // Require the XML_FOAF_Parser class. This is a pear library not included with phpwiki.
96         // see doc/README.foaf
97         if (findFile('XML/FOAF/Parser.php','missing_ok'))
98             require_once 'XML/FOAF/Parser.php';
99         //$ErrorManager->popErrorHandler();
100         if (!class_exists('XML_FOAF_Parser'))
101             return $this->error(_("required pear library XML/FOAF/Parser.php not found in include_path"));
102
103         extract($this->getArgs($argstr, $request));
104         // Get our FOAF File from the foaf plugin argument or $_GET['foaf']
105         if (empty($foaf)) $foaf = $request->getArg('foaf');
106         $chooser = HTML::form(array('method'=>'get','action'=>$request->getURLtoSelf()),
107                               HTML::h4(_("FOAF File URI")),
108                               HTML::input(array('id'=>'foaf','name'=>'foaf','type'=>'text','size'=>'80','value'=>$foaf)),
109                               HTML::br(),
110                               //HTML::p("Pretty HTML"),
111                               HTML::input(array('id'=>'pretty','name'=>'pretty','type'=>'radio','checked'=>'checked'),_("Pretty HTML")),
112                               //HTML::p("Original URL (Redirect)"),
113                               HTML::input(array('id'=>'original','name'=>'original','type'=>'radio'),_("Original URL (Redirect)")),
114                               HTML::br(),
115                               HTML::input(array('type'=>'submit','value'=>_("Parse FOAF")))
116                               //HTML::label(array('for'=>'foaf'),"FOAF File URI"),
117                               );
118         if (empty($foaf)) {
119             return $chooser;
120         }
121         else {
122             //Error Checking
123             if (substr($foaf,0,7) != "http://") {
124                 return $this->error(_("foaf must be a URI starting with http://"));
125             }
126             // Start of output
127             if (!empty($original)) {
128                 $request->redirect($foaf);
129             }
130             else {
131                 $foaffile = url_get_contents($foaf);
132                 if (!$foaffile) {
133                     //TODO: get errormsg
134                     return HTML(HTML::p("Resource isn't available: Something went wrong, probably a 404!"));
135                 }
136                 // Create new Parser object
137                 $parser = new XML_FOAF_Parser;
138                 // Parser FOAF into $foaffile
139                 $parser->parseFromMem($foaffile);
140                 $a = $parser->toArray();
141                         
142                 $html = HTML(HTML::h1(@$a[0]["name"]),
143                             HTML::table(
144                                         HTML::thead(),
145                                         HTML::tbody(
146                                                     @$a[0]["title"] ? 
147                                                         HTML::tr(HTML::td(_("Title")),
148                                                                  HTML::td($a[0]["title"])) : null,
149                                                     (@$a[0]["homepage"][0]) ? 
150                                                         $this->iterateHTML($a[0],"homepage",$a["dc"]) : null,
151                                                     (@$a[0]["weblog"][0]) ?
152                                                         $this->iterateHTML($a[0],"weblog",$a["dc"]) : null,
153                                                     //This seems broken?
154                                                     /*
155                                                      HTML::tr(HTML::td("Full Name"),
156                                                                        (@$a[0]["name"][0]) ?                                    
157                                                                        HTML::td(@$a[0]["name"]) :
158                                                                        (@$a[0]["firstname"][0] && @$a[0]["surname"][0]) ?
159                                                                        HTML::td(@$a[0]["firstname"][0] . " " . @$a[0]["surname"][0])
160                                                                        : null
161                                                     */
162                                                     HTML::tr(HTML::td("Full Name"),
163                                                              (@$a[0]["name"][0]) ?                                      
164                                                              HTML::td(@$a[0]["name"]) : null
165                                                              ),
166                                                     (@$a[0]["nick"][0]) ?
167                                                     $this->iterateHTML($a[0],"nick",$a["dc"])
168                                                     : null,
169                                                     (@$a[0]["mboxsha1sum"][0]) ?
170                                                     $this->iterateHTML($a[0],"mboxsha1sum",$a["dc"])
171                                                     : null,
172                                                     (@$a[0]["depiction"][0]) ?
173                                                     $this->iterateHTML($a[0],"depiction",$a["dc"])
174                                                     : null,
175                                                     (@$a[0]["seealso"][0]) ?
176                                                     $this->iterateHTML($a[0],"seealso",$a["dc"])
177                                                     : null,
178                                                     HTML::tr(HTML::td("Source"),
179                                                              HTML::td(
180                                                                       HTML::a(array('href'=>@$foaf),"RDF")
181                                                                       )
182                                                              )
183                                                     )
184                                         )
185                              );
186                 if (DEBUG) {
187                     $html->pushContent(HTML::hr(),$chooser);
188                 }
189                 return $html;
190             }
191         }
192     }
193
194     /**
195      * Renders array elements as HTML. May be used recursively.
196      *
197      * @param $array Source array
198      * @param $index Element Index to use.
199      * @todo Make sure it can look more than 1 layer deep
200      * @todo Pass in dublincore metadata
201      */
202     function iterateHTML($array,$index,$dc=NULL) {
203         for ($i=0;$i<count($array[$index]);$i++) {
204             //Cater for different types
205             $string = $array[$index][$i];
206
207             if ($index == "mboxsha1sum") {
208                 $string = '<a href="http://beta.plink.org/profile/' . $array[$index][$i] . '">'
209                     .'<img src="http://beta.plink.org/images/plink.png" alt="Plink - ' . $array[$index][$i] . '" /></a>';
210             }
211             else if ($index == "depiction") { 
212                 $string = '<img src="' . $array[$index][$i] . '" />';
213             }
214             else if ((substr($array[$index][$i],0,7) == "http://") || (substr($array[$index][$i],0,7) == "mailto:")) { 
215                 $string = '<a href="' . $array[$index][$i] . '"';
216                                 
217                 if (@$dc["description"][$array[$index][$i]]) {
218                     $string .= ' title="' . $dc["description"][$array[$index][$i]] . '"';
219                 }
220                 $string .= '>';
221                 if (@$dc["title"][$array[$index][$i]]) {
222                     $string .=  $dc["title"][$array[$index][$i]];
223                 }
224                 else {
225                     $string .= $array[$index][$i];
226                 }                               
227                 $string .= '</a>';
228             }
229             @$html .= "<tr><td>" . $index . "</td><td>" . $string . "</td></tr>";
230         }
231         
232         return HTML::raw($html);
233     }
234 }
235
236 // For emacs users
237 // Local Variables:
238 // mode: php
239 // tab-width: 8
240 // c-basic-offset: 4
241 // c-hanging-comment-ender-p: nil
242 // indent-tabs-mode: nil
243 // End:
244 ?>