1 <?php rcs_id('$Id: interwiki.php,v 1.19 2002-02-03 20:04:41 carstenklapp Exp $');
4 function InterWikiMap (&$request) {
5 $dbi = $request->getDbh();
7 $intermap = $this->_getMapFromWikiPage($dbi->getPage(_("InterWikiMap")));
9 if (!$intermap && defined('INTERWIKI_MAP_FILE'))
10 $intermap = $this->_getMapFromFile(INTERWIKI_MAP_FILE);
12 $this->_map = $this->_parseMap($intermap);
13 $this->_regexp = $this->_getRegexp();
16 function GetMap (&$request) {
19 $map = new InterWikiMap($request);
23 function getRegexp() {
24 return $this->_regexp;
27 function link ($link, $linktext = false) {
29 list ($moniker, $page) = split (":", $link, 2);
31 if (!isset($this->_map[$moniker])) {
32 return HTML::span(array('class' => 'bad-interwiki'),
33 $linktext ? $linktext : $link);
36 $url = $this->_map[$moniker];
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;
42 if (strstr($url, '%s'))
43 $url = sprintf($url, $page_enc);
47 if ($moniker == "Category") {
48 $link = HTML::a(array('href' => $url, 'class' => 'wiki'), $link);
50 $link = HTML::a(array('href' => $url),
51 IconForLink('interwiki'));
53 $link->pushContent("$moniker:",
54 HTML::span(array('class' => 'wikipage'), $page));
55 $link->setAttr('class', 'interwiki');
57 $link->pushContent($linktext);
58 $link->setAttr('class', 'named-interwiki');
66 function _parseMap ($text) {
67 global $AllowedProtocols;
68 if (!preg_match_all("/^\s*(\S+)\s+((?:$AllowedProtocols):[^\s<>\"']+)/m",
69 $text, $matches, PREG_SET_ORDER))
71 foreach ($matches as $m) {
72 if (substr($m[1], 0, 1) == "~")
73 $m[1] = substr($m[1], 1);
76 $map['Category'] = 'Category';
80 function _getMapFromWikiPage ($page) {
81 if (! $page->get('locked'))
84 $current = $page->getCurrentRevision();
86 if (preg_match('|^<pre>\n(.*)^</pre>|ms',
87 $current->getPackedContent(), $m)) {
93 function _getMapFromFile ($filename) {
94 $error_html = sprintf(_("Loading InterWikiMap from external file %s."), $filename);
95 trigger_error( $error_html, E_USER_NOTICE );
97 @$fd = fopen ($filename, "rb");
98 @$data = fread ($fd, filesize($filename));
104 function _getRegexp () {
106 return '(?:(?!a)a)'; // Never matches.
108 foreach (array_keys($this->_map) as $moniker)
109 $qkeys[] = preg_quote($moniker, '/');
110 return "(?:" . join("|", $qkeys) . ")";
120 // c-hanging-comment-ender-p: nil
121 // indent-tabs-mode: nil