]> CyberLeo.Net >> Repos - SourceForge/phpwiki.git/blob - lib/plugin/FoafViewer.php
function run: @return mixed
[SourceForge/phpwiki.git] / lib / plugin / FoafViewer.php
1 <?php
2
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 along
19  * with PhpWiki; if not, write to the Free Software Foundation, Inc.,
20  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 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     private function error_handler($error)
61     {
62         if (strstr($error->errstr, "Failed opening required 'XML/FOAF/Parser.php'"))
63             return true;
64         elseif (strstr($error->errstr, 'No such file or directory'))
65             return true;
66         return false;
67     }
68
69     function getDescription()
70     {
71         return _("Parse an RDF FOAF file and extract information to render as HTML.");
72     }
73
74     function getDefaultArguments()
75     {
76         return array('foaf' => false, // the URI to parse
77             //'userid'   => false,
78             'original' => false
79         );
80     }
81
82     /**
83      * @param WikiDB $dbi
84      * @param string $argstr
85      * @param WikiRequest $request
86      * @param string $basepage
87      * @return mixed
88      */
89     function run($dbi, $argstr, &$request, $basepage)
90     {
91
92         /* ignore fatal on loading */
93         /*
94         global $ErrorManager;
95         $ErrorManager->pushErrorHandler(new WikiMethodCb($this,'error_handler'));
96         */
97         // Require the XML_FOAF_Parser class. This is a PEAR library not included with phpwiki.
98         // see doc/README.foaf
99         if (findFile('XML/FOAF/Parser.php', 'missing_ok'))
100             require_once 'XML/FOAF/Parser.php';
101         //$ErrorManager->popErrorHandler();
102         if (!class_exists('XML_FOAF_Parser'))
103             return $this->error(_("required PEAR library XML/FOAF/Parser.php not found in include_path"));
104
105         extract($this->getArgs($argstr, $request));
106         // Get our FOAF File from the foaf plugin argument or $_GET['foaf']
107         if (empty($foaf)) $foaf = $request->getArg('foaf');
108         $chooser = HTML::form(array('method' => 'get', 'action' => $request->getURLtoSelf()),
109             HTML::h4(_("FOAF File URI")),
110             HTML::input(array('id' => 'foaf', 'name' => 'foaf', 'type' => 'text', 'size' => '80', 'value' => $foaf)),
111             HTML::br(),
112             //HTML::p("Pretty HTML"),
113             HTML::input(array('id' => 'pretty', 'name' => 'pretty', 'type' => 'radio', 'checked' => 'checked'), _("Pretty HTML")),
114             //HTML::p("Original URL (Redirect)"),
115             HTML::input(array('id' => 'original', 'name' => 'original', 'type' => 'radio'), _("Original URL (Redirect)")),
116             HTML::br(),
117             HTML::input(array('type' => 'submit', 'value' => _("Parse FOAF")))
118         //HTML::label(array('for'=>'foaf'),"FOAF File URI"),
119         );
120         if (empty($foaf)) {
121             return $chooser;
122         } else {
123             //Error Checking
124             if (substr($foaf, 0, 7) != "http://") {
125                 return $this->error(_("foaf must be a URI starting with http://"));
126             }
127             // Start of output
128             if (!empty($original)) {
129                 $request->redirect($foaf);
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         return '';
193     }
194
195     /**
196      * Renders array elements as HTML. May be used recursively.
197      *
198      * @param array $array Source array
199      * @param int $index Element Index to use.
200      * @param null $dc
201      * @return \RawXml
202      * @todo Make sure it can look more than 1 layer deep
203      * @todo Pass in dublincore metadata
204      */
205     function iterateHTML($array, $index, $dc = NULL)
206     {
207         for ($i = 0; $i < count($array[$index]); $i++) {
208             //Cater for different types
209             $string = $array[$index][$i];
210
211             if ($index == "mboxsha1sum") {
212                 $string = '<a href="http://beta.plink.org/profile/' . $array[$index][$i] . '">'
213                     . '<img src="http://beta.plink.org/images/plink.png" alt="Plink - ' . $array[$index][$i] . '" /></a>';
214             } elseif ($index == "depiction") {
215                 $string = '<img src="' . $array[$index][$i] . '" />';
216             } elseif ((substr($array[$index][$i], 0, 7) == "http://") || (substr($array[$index][$i], 0, 7) == "mailto:")) {
217                 $string = '<a href="' . $array[$index][$i] . '"';
218
219                 if (@$dc["description"][$array[$index][$i]]) {
220                     $string .= ' title="' . $dc["description"][$array[$index][$i]] . '"';
221                 }
222                 $string .= '>';
223                 if (@$dc["title"][$array[$index][$i]]) {
224                     $string .= $dc["title"][$array[$index][$i]];
225                 } else {
226                     $string .= $array[$index][$i];
227                 }
228                 $string .= '</a>';
229             }
230             @$html .= "<tr><td>" . $index . "</td><td>" . $string . "</td></tr>";
231         }
232
233         return HTML::raw($html);
234     }
235 }
236
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: