1<?php
2/**
3 * @phpcs:disable PSR1.Classes.ClassDeclaration.MultipleClasses
4 */
5
6/**
7 * SIOC::WikiDokuArticle object
8 *
9 * Contains information about a wiki article
10 */
11class SIOCDokuWikiArticle extends SIOCObject
12{
13
14    private $type = 'sioct:WikiArticle';
15    private $id = null;
16    private $url = null;
17    private $subject = null;
18    private $creator = array();
19    private $contributors = array();
20    private $created = null;
21    private $modified = null;
22    private $links = array();
23    private $backlinks = array();
24    private $previous_version = null;
25    private $next_version = null;
26    private $latest_version = false; // show latest version
27    private $has_container = null;
28    private $has_space = null;
29    private $content = null;
30    private $content_encoded = null;
31    private $is_creator = false;
32
33    public function __construct($id, $url, $subject, $content)
34    {
35        $this->id      = $id;
36        $this->url     = $url;
37        $this->subject = $subject;
38        $this->content = $content;
39    }
40
41    public function addCreated($created)
42    {
43        $this->created = $created;
44    }
45
46    public function addModified($modified)
47    {
48        $this->modified = $modified;
49    }
50
51    public function addCreator($creator)
52    {
53        $this->creator = $creator;
54    }
55
56    public function addContributors($contributors)
57    {
58        $this->contributors = $contributors;
59    }
60
61    public function isCreator()
62    {
63        $this->is_creator = true;
64    }
65
66    public function addLinks($links)
67    {
68        if (is_array($links) && count($links) > 0) {
69            $this->links = $links;
70        }
71    }
72
73    public function addBacklinks($links)
74    {
75        $this->backlinks = $links;
76    }
77
78    //function addLinksExtern($links) { if (is_array($links) && count($links)>0) $this->ext_links = $links; }
79    public function addVersionPrevious($rev)
80    {
81        $this->previous_version = $rev;
82    }
83
84    public function addVersionNext($rev)
85    {
86        $this->next_version = $rev;
87    }
88
89    public function addVersionLatest()
90    {
91        $this->latest_version = true;
92    }
93
94    public function addContentEncoded($encoded)
95    {
96        $this->content_encoded = $encoded;
97    }
98
99    public function addContainer($id)
100    {
101        $this->has_container = $id;
102    }
103
104    public function addSite($url)
105    {
106        $this->has_space = $url;
107    }
108
109    public function getContent(&$exp): string
110    {
111        $rdf = '<' . $this->type . " rdf:about=\"" . clean($this->url, true) . "\">\n";
112        if ($this->subject) {
113            $rdf .= "    <dc:title>" . clean($this->subject) . "</dc:title>\n";
114            // if(strcmp($this->has_container, 'http://en.wikipedia.org')===0)
115            //    $rdf .= "    <foaf:primaryTopic rdf:resource=\"".clean('http://dbpedia.org/resource/'
116            //      .$this->subject)."\"/>\n";
117        }
118
119        $creator_name = null;
120
121        if (count($this->contributors) > 0) {
122            foreach ($this->contributors as $cont_id => $cont_name) {
123                if (!isset($this->creator['sioc:modifier']) || ($this->creator['sioc:modifier'] != $cont_id)) {
124                    $rdf .= "    <sioc:has_modifier rdf:resource=\"" . normalizeUri(
125                            $exp->siocURL('user', $cont_id)
126                        ) . "\" rdfs:label=\"" . clean($cont_name) . "\"/>\n";
127                }
128            }
129
130            if (isset($this->contributors[$this->creator['sioc:modifier']])) {
131                $creator_name = 'rdfs:label="' . clean($this->contributors[$this->creator['sioc:modifier']]) . '"';
132            }
133        }
134
135        if (is_array($this->creator)) {
136            // if ($this->creator['foaf:maker'])
137            //     $rdf .= "    <foaf:maker rdf:resource=\"".clean($this->creator['foaf:maker'])."\"/>\n";
138            if ($this->creator['sioc:modifier']) {
139                if ($this->is_creator === false) {
140                    $rdf .= "    <sioc:has_modifier rdf:resource=\"" . normalizeUri(
141                            $exp->siocURL('user', $this->creator['sioc:modifier'])
142                        ) . "\" $creator_name/>\n";
143                }
144                if ($this->is_creator === true) {
145                    $rdf .= "    <sioc:has_creator rdf:resource=\"" . normalizeUri(
146                            $exp->siocURL('user', $this->creator['sioc:modifier'])
147                        ) . "\" $creator_name/>\n";
148                }
149            }
150        }
151
152        if ($this->created) {
153            $rdf .= "    <dcterms:created>" . $this->created . "</dcterms:created>\n";
154        }
155
156        if ($this->modified) {
157            $rdf .= "    <dcterms:modified>" . $this->modified . "</dcterms:modified>\n";
158        }
159
160        if ($this->has_space) {
161            $rdf .= "    <sioc:has_space rdf:resource=\"" . clean($this->has_space, true) . "\" />\n";
162            // TODO: rdfs:label
163        }
164
165        if ($this->has_container) {
166            $rdf .= "    <sioc:has_container rdf:resource=\"" . normalizeUri(
167                    $exp->siocURL('container', $this->has_container)
168                ) . "\" />\n";
169            // TODO: rdfs:label
170        }
171
172        if ($this->content) {
173            $rdf .= "    <sioc:content><![CDATA[" . pureContent($this->content) . "]]></sioc:content>\n";
174        }
175
176        if ($this->content_encoded) {
177            $rdf .= "    <content:encoded><![CDATA[" . $this->content_encoded . "]]></content:encoded>\n";
178        }
179
180        /*
181        if(is_array($this->topics)) {
182            foreach($this->topics as $topic=>$url) {
183                $rdf .= "    <sioc:topic>\n";
184                $rdf .= "        <sioct:Category rdf:about=\"" . clean($url) ."\">\n";
185                $rdf .= "            <rdfs:seeAlso rdf:resource=\"" .
186                        clean('http://ws.sioc-project.org/mediawiki/mediawiki.php?wiki='.$url);
187                if ($this->api) $rdf .= clean("&api=" . $this->api);
188                $rdf .= "\"/>\n";
189                $rdf .= "        </sioct:Category>\n";
190                $rdf .= "    </sioc:topic>\n";
191            }
192        }
193        */
194
195        if (is_array($this->links) && count($this->links) > 0) {
196            foreach ($this->links as $link_id => $link_exists) {
197                if ($link_exists && !isHiddenPage($link_id)) {
198                    $rdf .= "    <sioc:links_to rdf:resource=\"" . normalizeUri(
199                            $exp->siocURL('post', $link_id)
200                        ) . "\"/>\n";
201                    // TODO: rdfs:label
202                }
203            }
204        }
205
206        if (count($this->backlinks) > 0) {
207            foreach ($this->backlinks as $link_id) {
208                if (!isHiddenPage($link_id)) {
209                    $rdf .= "    <dcterms:isReferencedBy rdf:resource=\"" . normalizeUri(
210                            $exp->siocURL('post', $link_id)
211                        ) . "\"/>\n";
212                    // TODO: rdfs:label
213                }
214            }
215        }
216
217        /*
218        if(is_array($this->ext_links)) {
219            foreach($this->ext_links as $label=>$url) {
220                $rdf .= "    <sioc:links_to rdf:resource=\"" . clean($url) ."\"/>\n";
221            }
222        }
223        */
224
225        if ($this->previous_version) {
226            $rdf .= "    <sioc:previous_version rdf:resource=\"" . normalizeUri(
227                    $exp->siocURL(
228                        'post',
229                        $this->id . $exp->_urlseparator . 'rev' . $exp->_urlequal . $this->previous_version
230                    )
231                ) . "\"/>\n";
232            // TODO: rdfs:label
233
234            /* If there is support for inference and transitivity the following is not needed */
235            $rdf .= "    <sioc:earlier_version rdf:resource=\"" . normalizeUri(
236                    $exp->siocURL(
237                        'post',
238                        $this->id . $exp->_urlseparator . 'rev' . $exp->_urlequal . $this->previous_version
239                    )
240                ) . "\"/>\n";
241            // TODO: rdfs:label
242
243        }
244
245        if ($this->next_version) {
246            $rdf .= "    <sioc:next_version rdf:resource=\"" . normalizeUri(
247                    $exp->siocURL(
248                        'post',
249                        $this->id . $exp->_urlseparator . 'rev' . $exp->_urlequal . $this->next_version
250                    )
251                ) . "\"/>\n";
252            // TODO: rdfs:label
253
254            /* If there is support for inference and transitivity the following is not needed */
255            $rdf .= "    <sioc:later_version rdf:resource=\"" . normalizeUri(
256                    $exp->siocURL(
257                        'post',
258                        $this->id . $exp->_urlseparator . 'rev' . $exp->_urlequal . $this->next_version
259                    )
260                ) . "\"/>\n";
261            // TODO: rdfs:label
262        }
263
264        if ($this->latest_version) {
265            $rdf .= "    <sioc:latest_version rdf:resource=\"" . normalizeUri(
266                    $exp->siocURL('post', $this->id)
267                ) . "\"/>\n";
268            // TODO: rdfs:label
269        }
270
271        /*
272        if($this->has_discussion && (strpos($this->has_discussion, 'Talk:Talk:') == FALSE)) {
273                $rdf .= "    <sioc:has_discussion>\n";
274                $rdf .= "        <sioct:WikiArticle rdf:about=\"" . clean($this->has_discussion) ."\">\n";
275                $rdf .= "            <rdfs:seeAlso rdf:resource=\"" .
276                        clean('http://ws.sioc-project.org/mediawiki/mediawiki.php?wiki='.$this->has_discussion);
277                if ($this->api) $rdf .= clean("&api=" . $this->api);
278                $rdf .= "\"/>\n";
279                $rdf .= "        </sioct:WikiArticle>\n";
280                $rdf .= "    </sioc:has_discussion>\n";
281        }
282        */
283
284        /*
285        if($this->redirpage)
286        {
287            $rdf .= "    <owl:sameAs rdf:resource=\"" . clean($this->redirpage) ."\"/>\n";
288            $rdf .= "    <rdfs:seeAlso rdf:resource=\"" .
289                        clean('http://ws.sioc-project.org/mediawiki/mediawiki.php?wiki='.$this->redirpage);
290            if ($this->api) $rdf .= clean("&api=" . $this->api);
291            $rdf .= "\"/>\n";
292        }
293        */
294
295        $rdf .= "</" . $this->type . ">\n";
296        return $rdf;
297    }
298}
299
300/**
301 * SIOC::DokuWikiUser object
302 *
303 * Contains information about a wiki user
304 */
305class SIOCDokuWikiUser extends SIOCObject
306{
307
308    private $type = 'user';
309
310    private $id;
311    private $nick;
312    private $url;
313    private $name;
314    private $email;
315    private $sha1;
316    private $homepage;
317    private $foaf_uri;
318    private $role;
319    private $sioc_url;
320    private $foaf_url;
321
322    public function __construct($id, $url, $userid, $name, $email)
323    {
324        $this->id   = $id;
325        $this->nick = $userid;
326        $this->name = $name;
327        //$this->email = $email;
328        $this->url = $url;
329
330        if (preg_match_all('/^.+@.+\..+$/Ui', $email, $check, PREG_SET_ORDER)) {
331            if (preg_match_all('/^mailto:(.+@.+\..+$)/Ui', $email, $matches, PREG_SET_ORDER)) {
332                $this->email = $email;
333                $this->sha1  = sha1($email);
334            } else {
335                $this->email = "mailto:" . $email;
336                $this->sha1  = sha1("mailto:" . $email);
337            }
338        }
339    }
340
341    public function getContent(&$exp): string
342    {
343        $rdf = "<sioc:UserAccount rdf:about=\"" . clean($this->url, true) . "\">\n";
344        if ($this->nick) {
345            $rdf .= "    <sioc:name>" . clean($this->nick) . "</sioc:name>\n";
346        }
347        if ($this->email) {
348            if ($exp->_export_email) {
349                $rdf .= "    <sioc:email rdf:resource=\"" . $this->email . "\"/>\n";
350            }
351            $rdf .= "    <sioc:email_sha1>" . $this->sha1 . "</sioc:email_sha1>\n";
352        }
353        if ($this->role) {
354            $rdf .= "    <sioc:has_function>\n";
355            $rdf .= "        <sioc:Role>\n";
356            $rdf .= "            <sioc:name>" . $this->role . "</sioc:name>\n";
357            $rdf .= "        </sioc:Role>\n";
358            $rdf .= "    </sioc:has_function>\n";
359        }
360        $rdf .= "    <sioc:account_of>\n";
361        $rdf .= "        <foaf:Person>\n";
362        if ($this->name) {
363            $rdf .= "            <foaf:name>" . clean($this->name) . "</foaf:name>\n";
364        }
365        if ($this->email) {
366            $rdf .= "            <foaf:mbox_sha1sum>" . $this->sha1 . "</foaf:mbox_sha1sum>\n";
367        }
368        if ($this->foaf_url) {
369            $rdf .= "            <rdfs:seeAlso rdf:resource=\"" . $this->foaf_url . "\"/>\n";
370        }
371        $rdf .= "        </foaf:Person>\n";
372        $rdf .= "    </sioc:account_of>\n";
373        //if($this->sioc_url) { $rdf .= "            <rdfs:seeAlso rdf:resource=\"". $this->sioc_url ."\"/>\n"; }
374        $rdf .= "</sioc:UserAccount>\n";
375
376        return $rdf;
377    }
378}
379
380/**
381 * SIOC::DokuWikiContainer object
382 *
383 * Contains information about a wiki container
384 */
385class SIOCDokuWikiContainer extends SIOCObject
386{
387
388    private $type = 'sioc:Container';
389
390    private $id = null;
391    private $url = null;
392    private $posts = array();
393    private $subcontainers = array();
394    private $has_parent = null;
395    private $title = null;
396
397    public function __construct($id, $url)
398    {
399        $this->id  = $id;
400        $this->url = $url;
401    }
402
403    public function isWiki()
404    {
405        $this->type = 'sioct:Wiki';
406    }
407
408    public function addArticles($posts)
409    {
410        $this->posts = $posts;
411    }
412
413    public function addContainers($containers)
414    {
415        $this->subcontainers = $containers;
416    }
417
418    public function addTitle($title)
419    {
420        $this->title = $title;
421    }
422
423    public function addParent($id)
424    {
425        $this->_has_parent = $id;
426    }
427
428    public function getContent(&$exp): string
429    {
430        $rdf = '<' . $this->type . " rdf:about=\"" . normalizeUri(clean($this->url, true)) . "\" >\n";
431
432        if ($this->title) {
433            $rdf .= "    <sioc:name>" . clean($this->title) . "</sioc:name>\n";
434        }
435
436        if ($this->_has_parent) {
437            $rdf .= "    <sioc:has_parent rdf:resource=\"" . normalizeUri(
438                    $exp->siocURL('container', $this->_has_parent)
439                ) . "\" />\n";
440            // TODO: rdfs:label
441        }
442
443        foreach ($this->posts as $article) {
444            // TODO: test permission before?
445            $rdf .= "    <sioc:container_of rdf:resource=\"" . normalizeUri(
446                    $exp->siocURL('post', $article['id'])
447                ) . "\"/>\n";
448            // TODO: inluding title/name
449        }
450
451        foreach ($this->subcontainers as $container) {
452            $rdf .= "    <sioc:parent_of rdf:resource=\"" . normalizeUri(
453                    $exp->siocURL('container', $container['id'])
454                ) . "\"/>\n";
455            // TODO: inluding title/name
456        }
457
458        $rdf .= "</" . $this->type . ">\n";
459        return $rdf;
460    }
461
462}
463
464