]> CyberLeo.Net >> Repos - SourceForge/phpwiki.git/blob - lib/interwiki.php
Added a page load timer temporarily, to help in
[SourceForge/phpwiki.git] / lib / interwiki.php
1 <?php rcs_id('$Id: interwiki.php,v 1.19 2002-02-03 20:04:41 carstenklapp Exp $');
2
3 class InterWikiMap {
4     function InterWikiMap (&$request) {
5         $dbi = $request->getDbh();
6
7         $intermap = $this->_getMapFromWikiPage($dbi->getPage(_("InterWikiMap")));
8
9         if (!$intermap && defined('INTERWIKI_MAP_FILE'))
10             $intermap = $this->_getMapFromFile(INTERWIKI_MAP_FILE);
11
12         $this->_map = $this->_parseMap($intermap);
13         $this->_regexp = $this->_getRegexp();
14     }
15
16     function GetMap (&$request) {
17         static $map;
18         if (empty($map))
19             $map = new InterWikiMap($request);
20         return $map;
21     }
22     
23     function getRegexp() {
24         return $this->_regexp;
25     }
26
27     function link ($link, $linktext = false) {
28
29         list ($moniker, $page) = split (":", $link, 2);
30         
31         if (!isset($this->_map[$moniker])) {
32             return HTML::span(array('class' => 'bad-interwiki'),
33                               $linktext ? $linktext : $link);
34         }
35
36         $url = $this->_map[$moniker];
37         
38         // Urlencode page only if it's a query arg.
39         // FIXME: this is a somewhat broken heuristic.
40         $page_enc = strstr($url, '?') ? rawurlencode($page) : $page;
41
42         if (strstr($url, '%s'))
43             $url = sprintf($url, $page_enc);
44         else
45             $url .= $page_enc;
46
47         if ($moniker == "Category") {
48             $link = HTML::a(array('href' => $url, 'class' => 'wiki'), $link);
49         } else {
50             $link = HTML::a(array('href' => $url),
51                             IconForLink('interwiki'));
52             if (!$linktext) {
53                 $link->pushContent("$moniker:",
54                                    HTML::span(array('class' => 'wikipage'), $page));
55                 $link->setAttr('class', 'interwiki');
56             } else {
57                 $link->pushContent($linktext);
58                 $link->setAttr('class', 'named-interwiki');
59             }
60         }
61         
62         return $link;
63     }
64
65
66     function _parseMap ($text) {
67         global $AllowedProtocols;
68         if (!preg_match_all("/^\s*(\S+)\s+((?:$AllowedProtocols):[^\s<>\"']+)/m",
69                             $text, $matches, PREG_SET_ORDER))
70             return false;
71         foreach ($matches as $m) {
72             if (substr($m[1], 0, 1) == "~")
73                 $m[1] = substr($m[1], 1);
74             $map[$m[1]] = $m[2];
75         }
76         $map['Category'] = 'Category';
77         return $map;
78     }
79
80     function _getMapFromWikiPage ($page) {
81         if (! $page->get('locked'))
82             return false;
83         
84         $current = $page->getCurrentRevision();
85         
86         if (preg_match('|^<pre>\n(.*)^</pre>|ms',
87                        $current->getPackedContent(), $m)) {
88             return $m[1];
89         }
90         return false;
91     }
92
93     function _getMapFromFile ($filename) {
94         $error_html = sprintf(_("Loading InterWikiMap from external file %s."), $filename);
95         trigger_error( $error_html, E_USER_NOTICE );
96
97         @$fd = fopen ($filename, "rb");
98         @$data = fread ($fd, filesize($filename));
99         @fclose ($fd);
100
101         return $data;
102     }
103
104     function _getRegexp () {
105         if (!$this->_map)
106             return '(?:(?!a)a)'; //  Never matches.
107         
108         foreach (array_keys($this->_map) as $moniker)
109             $qkeys[] = preg_quote($moniker, '/');
110         return "(?:" . join("|", $qkeys) . ")";
111     }
112 }
113             
114
115 // For emacs users
116 // Local Variables:
117 // mode: php
118 // tab-width: 8
119 // c-basic-offset: 4
120 // c-hanging-comment-ender-p: nil
121 // indent-tabs-mode: nil
122 // End:
123 ?>