OSDN Git Service

Correct r1.8. It's useless without index.php
[pukiwiki/pukiwiki.git] / lib / make_link.php
1 <?php
2 // PukiWiki - Yet another WikiWikiWeb clone.
3 // $Id: make_link.php,v 1.10 2005/01/15 03:16:22 henoheno Exp $
4 //
5 // Hyperlink-related functions
6
7 // ¥ê¥ó¥¯¤òÉղ乤ë
8 function make_link($string, $page = '')
9 {
10         global $vars;
11         static $converter;
12
13         if (! isset($converter)) $converter = new InlineConverter();
14
15         $clone = $converter->get_clone($converter);
16
17         return $clone->convert($string, ($page != '') ? $page : $vars['page']);
18 }
19
20 //¥¤¥ó¥é¥¤¥óÍ×ÁǤòÃÖ´¹¤¹¤ë
21 class InlineConverter
22 {
23         var $converters; // as array()
24         var $pattern;
25         var $pos;
26         var $result;
27
28         function get_clone($obj) {
29                 static $clone_func;
30
31                 if (! isset($clone_func)) {
32                         if (version_compare(PHP_VERSION, '5.0.0', '<')) {
33                                 $clone_func = create_function('$a', 'return $a;');
34                         } else {
35                                 $clone_func = create_function('$a', 'return clone $a;');
36                         }
37                 }
38                 return $clone_func($obj);
39         }
40
41         function __clone() {
42                 $converters = array();
43                 foreach ($this->converters as $key=>$converter) {
44                         $converters[$key] = $this->get_clone($converter);
45                 }
46                 $this->converters = $converters;
47         }
48
49         function InlineConverter($converters = NULL, $excludes = NULL)
50         {
51                 if ($converters === NULL) {
52                         $converters = array(
53                                 'plugin',        // ¥¤¥ó¥é¥¤¥ó¥×¥é¥°¥¤¥ó
54                                 'note',          // Ãí¼á
55                                 'url',           // URL
56                                 'url_interwiki', // URL (interwiki definition)
57                                 'mailto',        // mailto:
58                                 'interwikiname', // InterWikiName
59                                 'autolink',      // AutoLink
60                                 'bracketname',   // BracketName
61                                 'wikiname',      // WikiName
62                                 'autolink_a',    // AutoLink(¥¢¥ë¥Õ¥¡¥Ù¥Ã¥È)
63                         );
64                 }
65
66                 if ($excludes !== NULL)
67                         $converters = array_diff($converters, $excludes);
68
69                 $this->converters = $patterns = array();
70                 $start = 1;
71
72                 foreach ($converters as $name) {
73                         $classname = 'Link_' . $name;
74                         $converter = new $classname($start);
75                         $pattern   = $converter->get_pattern();
76                         if ($pattern === FALSE) continue;
77
78                         $patterns[] = '(' . "\n" . $pattern . "\n" . ')';
79                         $this->converters[$start] = $converter;
80                         $start += $converter->get_count();
81                         ++$start;
82                 }
83                 $this->pattern = join('|', $patterns);
84         }
85
86         function convert($string, $page)
87         {
88                 $this->page   = $page;
89                 $this->result = array();
90
91                 $string = preg_replace_callback('/' . $this->pattern . '/x',
92                         array(& $this, 'replace'), $string);
93
94                 $arr = explode("\x08", make_line_rules(htmlspecialchars($string)));
95                 $retval = '';
96                 while (! empty($arr)) {
97                         $retval .= array_shift($arr) . array_shift($this->result);
98                 }
99                 return $retval;
100         }
101
102         function replace($arr)
103         {
104                 $obj = $this->get_converter($arr);
105
106                 $this->result[] = ($obj !== NULL && $obj->set($arr, $this->page) !== FALSE) ?
107                         $obj->toString() : make_line_rules(htmlspecialchars($arr[0]));
108
109                 return "\x08"; //½èÍýºÑ¤ß¤ÎÉôʬ¤Ë¥Þ¡¼¥¯¤òÆþ¤ì¤ë
110         }
111
112         function get_objects($string, $page)
113         {
114                 $matches = $arr = array();
115                 preg_match_all('/' . $this->pattern . '/x', $string, $matches, PREG_SET_ORDER);
116                 foreach ($matches as $match) {
117                         $obj = $this->get_converter($match);
118                         if ($obj->set($match, $page) !== FALSE) {
119                                 $arr[] = $this->get_clone($obj);
120                                 if ($obj->body != '')
121                                         $arr = array_merge($arr, $this->get_objects($obj->body, $page));
122                         }
123                 }
124                 return $arr;
125         }
126
127         function & get_converter(& $arr)
128         {
129                 foreach (array_keys($this->converters) as $start) {
130                         if ($arr[$start] == $arr[0])
131                                 return $this->converters[$start];
132                 }
133                 return NULL;
134         }
135 }
136
137 //¥¤¥ó¥é¥¤¥óÍ×Áǽ¸¹ç¤Î¥Ù¡¼¥¹¥¯¥é¥¹
138 class Link
139 {
140         var $start;   // ³ç¸Ì¤ÎÀèƬÈÖ¹æ(0¥ª¥ê¥¸¥ó)
141         var $text;    // ¥Þ¥Ã¥Á¤·¤¿Ê¸»úÎóÁ´ÂÎ
142
143         var $type;
144         var $page;
145         var $name;
146         var $body;
147         var $alias;
148
149         // constructor
150         function Link($start)
151         {
152                 $this->start = $start;
153         }
154
155         // ¥Þ¥Ã¥Á¤Ë»ÈÍѤ¹¤ë¥Ñ¥¿¡¼¥ó¤òÊÖ¤¹
156         function get_pattern() {}
157
158         // »ÈÍѤ·¤Æ¤¤¤ë³ç¸Ì¤Î¿ô¤òÊÖ¤¹ ((?:...)¤ò½ü¤¯)
159         function get_count() {}
160
161         // ¥Þ¥Ã¥Á¤·¤¿¥Ñ¥¿¡¼¥ó¤òÀßÄꤹ¤ë
162         function set($arr,$page) {}
163
164         // Ê¸»úÎó¤ËÊÑ´¹¤¹¤ë
165         function toString() {}
166
167         // Private
168         // ¥Þ¥Ã¥Á¤·¤¿ÇÛÎ󤫤顢¼«Ê¬¤ËɬÍפÊÉôʬ¤À¤±¤ò¼è¤ê½Ð¤¹
169         function splice($arr) {
170                 $count = $this->get_count() + 1;
171                 $arr   = array_pad(array_splice($arr, $this->start, $count), $count, '');
172                 $this->text = $arr[0];
173                 return $arr;
174         }
175
176         // ´ðËܥѥé¥á¡¼¥¿¤òÀßÄꤹ¤ë
177         function setParam($page, $name, $body, $type = '', $alias = '')
178         {
179                 static $converter = NULL;
180
181                 $this->page = $page;
182                 $this->name = $name;
183                 $this->body = $body;
184                 $this->type = $type;
185                 if (is_url($alias) && preg_match('/\.(gif|png|jpe?g)$/i', $alias)) {
186                         $alias = htmlspecialchars($alias);
187                         $alias = '<img src="' . $alias . '" alt="' . $name . '" />';
188                 } else if ($alias != '') {
189                         if ($converter === NULL)
190                                 $converter = new InlineConverter(array('plugin'));
191
192                         $alias = make_line_rules($converter->convert($alias, $page));
193
194                         // BugTrack/669: A hack removing anchor tags added by AutoLink
195                         $alias = preg_replace('#</?a[^>]*>#i', '', $alias);
196                 }
197                 $this->alias = $alias;
198
199                 return TRUE;
200         }
201 }
202
203 // ¥¤¥ó¥é¥¤¥ó¥×¥é¥°¥¤¥ó
204 class Link_plugin extends Link
205 {
206         var $pattern;
207         var $plain,$param;
208
209         function Link_plugin($start)
210         {
211                 parent::Link($start);
212         }
213
214         function get_pattern()
215         {
216                 $this->pattern = <<<EOD
217 &
218 (      # (1) plain
219  (\w+) # (2) plugin name
220  (?:
221   \(
222    ((?:(?!\)[;{]).)*) # (3) parameter
223   \)
224  )?
225 )
226 EOD;
227                 return <<<EOD
228 {$this->pattern}
229 (?:
230  \{
231   ((?:(?R)|(?!};).)*) # (4) body
232  \}
233 )?
234 ;
235 EOD;
236         }
237
238         function get_count()
239         {
240                 return 4;
241         }
242
243         function set($arr, $page)
244         {
245                 list($all, $this->plain, $name, $this->param, $body) = $this->splice($arr);
246
247                 // ËÜÍè¤Î¥×¥é¥°¥¤¥ó̾¤ª¤è¤Ó¥Ñ¥é¥á¡¼¥¿¤ò¼èÆÀ¤·¤Ê¤ª¤¹ PHP4.1.2 (?R)Âкö
248                 $matches = array();
249                 if (preg_match('/^' . $this->pattern . '/x', $all, $matches)
250                         && $matches[1] != $this->plain) 
251                         list(, $this->plain, $name, $this->param) = $matches;
252
253                 return parent::setParam($page, $name, $body, 'plugin');
254         }
255
256         function toString()
257         {
258                 $body = ($this->body == '') ? '' : make_link($this->body);
259
260                 // ¥×¥é¥°¥¤¥ó¸Æ¤Ó½Ð¤·
261                 if (exist_plugin_inline($this->name)) {
262                         $str = do_plugin_inline($this->name, $this->param, $body);
263                         if ($str !== FALSE) //À®¸ù
264                                 return $str;
265                 }
266
267                 // ¥×¥é¥°¥¤¥ó¤¬Â¸ºß¤·¤Ê¤¤¤«¡¢ÊÑ´¹¤Ë¼ºÇÔ
268                 $body = (($body == '') ? '' : '{' . $body . '}') . ';';
269                 return make_line_rules(htmlspecialchars('&' . $this->plain) . $body);
270         }
271 }
272
273 // Footnotes
274 class Link_note extends Link
275 {
276         function Link_note($start)
277         {
278                 parent::Link($start);
279         }
280
281         function get_pattern()
282         {
283                 return <<<EOD
284 \(\(
285  ((?:(?R)|(?!\)\)).)*) # (1) note body
286 \)\)
287 EOD;
288         }
289
290         function get_count()
291         {
292                 return 1;
293         }
294
295         function set($arr, $page)
296         {
297                 global $foot_explain, $script, $vars;
298                 static $note_id = 0;
299
300                 list(, $body) = $this->splice($arr);
301
302                 $id   = ++$note_id;
303                 $note = make_link($body);
304                 $page = isset($vars['page']) ? htmlspecialchars($vars['page']) : '';
305
306                 // Footnote
307                 $foot_explain[$id] = <<<EOD
308 <a id="notefoot_$id" href="$script?$page#notetext_$id" class="note_super">*$id</a>
309 <span class="small">$note</span>
310 <br />
311 EOD;
312                 // A hyperlink, content-body to footnote
313                 $name = '<a id="notetext_' . $id . '" href="' .
314                         $script . '?' . $page . '#notefoot_' . $id .
315                         '" class="note_super">*' . $id . '</a>';
316
317                 return parent::setParam($page, $name, $body);
318         }
319
320         function toString()
321         {
322                 return $this->name;
323         }
324 }
325
326 // url
327 class Link_url extends Link
328 {
329         function Link_url($start)
330         {
331                 parent::Link($start);
332         }
333
334         function get_pattern()
335         {
336                 $s1 = $this->start + 1;
337                 return <<<EOD
338 (\[\[             # (1) open bracket
339  ((?:(?!\]\]).)+) # (2) alias
340  (?:>|:)
341 )?
342 (                 # (3) url
343  (?:(?:https?|ftp|news):\/\/|mailto:)[\w\/\@\$()!?&%#:;.,~'=*+-]+
344 )
345 (?($s1)\]\])      # close bracket
346 EOD;
347         }
348
349         function get_count()
350         {
351                 return 3;
352         }
353
354         function set($arr, $page)
355         {
356                 list(, , $alias, $name) = $this->splice($arr);
357                 return parent::setParam($page, htmlspecialchars($name),
358                         '', 'url', $alias == '' ? $name : $alias);
359         }
360
361         function toString()
362         {
363                 return '<a href="' . $this->name . '">' . $this->alias . '</a>';
364         }
365 }
366
367 // url (InterWiki definition type)
368 class Link_url_interwiki extends Link
369 {
370         function Link_url_interwiki($start)
371         {
372                 parent::Link($start);
373         }
374
375         function get_pattern()
376         {
377                 return <<<EOD
378 \[       # open bracket
379 (        # (1) url
380  (?:(?:https?|ftp|news):\/\/|\.\.?\/)[!~*'();\/?:\@&=+\$,%#\w.-]*
381 )
382 \s
383 ([^\]]+) # (2) alias
384 \]       # close bracket
385 EOD;
386         }
387
388         function get_count()
389         {
390                 return 2;
391         }
392
393         function set($arr, $page)
394         {
395                 list(, $name, $alias) = $this->splice($arr);
396                 return parent::setParam($page, htmlspecialchars($name), '', 'url', $alias);
397         }
398
399         function toString()
400         {
401                 return '<a href="' . $this->name . '">' . $this->alias . '</a>';
402         }
403 }
404
405 //mailto:
406 class Link_mailto extends Link
407 {
408         var $is_image, $image;
409
410         function Link_mailto($start)
411         {
412                 parent::Link($start);
413         }
414
415         function get_pattern()
416         {
417                 $s1 = $this->start + 1;
418                 return <<<EOD
419 (?:
420  \[\[
421  ((?:(?!\]\]).)+)(?:>|:)  # (1) alias
422 )?
423 ([\w.-]+@[\w-]+\.[\w.-]+) # (2) mailto
424 (?($s1)\]\])              # close bracket if (1)
425 EOD;
426         }
427
428         function get_count()
429         {
430                 return 2;
431         }
432
433         function set($arr, $page)
434         {
435                 list(, $alias, $name) = $this->splice($arr);
436                 return parent::setParam($page, $name, '', 'mailto', $alias == '' ? $name : $alias);
437         }
438         
439         function toString()
440         {
441                 return '<a href="mailto:' . $this->name . '">' . $this->alias . '</a>';
442         }
443 }
444
445 //InterWikiName
446 class Link_interwikiname extends Link
447 {
448         var $url    = '';
449         var $param  = '';
450         var $anchor = '';
451
452         function Link_interwikiname($start)
453         {
454                 parent::Link($start);
455         }
456
457         function get_pattern()
458         {
459                 $s2 = $this->start + 2;
460                 $s5 = $this->start + 5;
461                 return <<<EOD
462 \[\[                  # open bracket
463 (?:
464  ((?:(?!\]\]).)+)>    # (1) alias
465 )?
466 (\[\[)?               # (2) open bracket
467 ((?:(?!\s|:|\]\]).)+) # (3) InterWiki
468 (?<! > | >\[\[ )      # not '>' or '>[['
469 :                     # separator
470 (                     # (4) param
471  (\[\[)?              # (5) open bracket
472  (?:(?!>|\]\]).)+
473  (?($s5)\]\])         # close bracket if (5)
474 )
475 (?($s2)\]\])          # close bracket if (2)
476 \]\]                  # close bracket
477 EOD;
478         }
479
480         function get_count()
481         {
482                 return 5;
483         }
484
485         function set($arr, $page)
486         {
487                 global $script;
488
489                 list(, $alias, , $name, $this->param) = $this->splice($arr);
490
491                 $matches = array();
492                 if (preg_match('/^([^#]+)(#[A-Za-z][\w-]*)$/', $this->param, $matches))
493                         list(, $this->param, $this->anchor) = $matches;
494
495                 $url = get_interwiki_url($name, $this->param);
496                 $this->url = ($url === FALSE) ?
497                         $script . '?' . rawurlencode('[[' . $name . ':' . $this->param . ']]') :
498                         htmlspecialchars($url);
499
500                 return parent::setParam(
501                         $page,
502                         htmlspecialchars($name . ':' . $this->param),
503                         '',
504                         'InterWikiName',
505                         $alias == '' ? $name . ':' . $this->param : $alias
506                 );
507         }
508
509         function toString()
510         {
511                 return '<a href="' . $this->url . $this->anchor .
512                         '" title="' . $this->name . '">' . $this->alias . '</a>';
513         }
514 }
515
516 // BracketName
517 class Link_bracketname extends Link
518 {
519         var $anchor, $refer;
520
521         function Link_bracketname($start)
522         {
523                 parent::Link($start);
524         }
525
526         function get_pattern()
527         {
528                 global $WikiName, $BracketName;
529
530                 $s2 = $this->start + 2;
531                 return <<<EOD
532 \[\[                     # open bracket
533 (?:((?:(?!\]\]).)+)>)?   # (1) alias
534 (\[\[)?                  # (2) open bracket
535 (                        # (3) PageName
536  (?:$WikiName)
537  |
538  (?:$BracketName)
539 )?
540 (\#(?:[a-zA-Z][\w-]*)?)? # (4) anchor
541 (?($s2)\]\])             # close bracket if (2)
542 \]\]                     # close bracket
543 EOD;
544         }
545
546         function get_count()
547         {
548                 return 4;
549         }
550
551         function set($arr, $page)
552         {
553                 global $WikiName;
554
555                 list(, $alias, , $name, $this->anchor) = $this->splice($arr);
556
557                 if ($name == '' && $this->anchor == '') return FALSE;
558
559                 if ($name == '' || ! preg_match('/^' . $WikiName . '$/', $name)) {
560
561                         if ($alias == '') $alias = $name . $this->anchor;
562
563                         if ($name != '') {
564                                 $name = get_fullname($name, $page);
565                                 if (! is_pagename($name)) return FALSE;
566                         }
567                 }
568
569                 return parent::setParam($page, $name, '', 'pagename', $alias);
570         }
571
572         function toString()
573         {
574                 return make_pagelink(
575                         $this->name,
576                         $this->alias,
577                         $this->anchor,
578                         $this->page
579                 );
580         }
581 }
582
583 // WikiName
584 class Link_wikiname extends Link
585 {
586         function Link_wikiname($start)
587         {
588                 parent::Link($start);
589         }
590
591         function get_pattern()
592         {
593                 global $WikiName, $nowikiname;
594
595                 return $nowikiname ? FALSE : '(' . $WikiName . ')';
596         }
597
598         function get_count()
599         {
600                 return 1;
601         }
602
603         function set($arr, $page)
604         {
605                 list($name) = $this->splice($arr);
606                 return parent::setParam($page, $name, '', 'pagename', $name);
607         }
608
609         function toString()
610         {
611                 return make_pagelink(
612                         $this->name,
613                         $this->alias,
614                         '',
615                         $this->page
616                 );
617         }
618 }
619
620 // AutoLink
621 class Link_autolink extends Link
622 {
623         var $forceignorepages = array();
624         var $auto;
625         var $auto_a; // alphabet only
626
627         function Link_autolink($start)
628         {
629                 global $autolink;
630
631                 parent::Link($start);
632
633                 if (! $autolink || ! file_exists(CACHE_DIR . 'autolink.dat'))
634                         return;
635
636                 @list($auto, $auto_a, $forceignorepages) = file(CACHE_DIR . 'autolink.dat');
637                 $this->auto   = $auto;
638                 $this->auto_a = $auto_a;
639                 $this->forceignorepages = explode("\t", trim($forceignorepages));
640         }
641
642         function get_pattern()
643         {
644                 return isset($this->auto) ? '(' . $this->auto . ')' : FALSE;
645         }
646
647         function get_count()
648         {
649                 return 1;
650         }
651
652         function set($arr, $page)
653         {
654                 global $WikiName;
655
656                 list($name) = $this->splice($arr);
657
658                 // Ìµ»ë¥ê¥¹¥È¤Ë´Þ¤Þ¤ì¤Æ¤¤¤ë¡¢¤¢¤ë¤¤¤Ï¸ºß¤·¤Ê¤¤¥Ú¡¼¥¸¤ò¼Î¤Æ¤ë
659                 if (in_array($name, $this->forceignorepages) || ! is_page($name))
660                         return FALSE;
661
662                 return parent::setParam($page, $name, '', 'pagename', $name);
663         }
664
665         function toString()
666         {
667                 return make_pagelink(
668                         $this->name,
669                         $this->alias,
670                         '',
671                         $this->page
672                 );
673         }
674 }
675
676 class Link_autolink_a extends Link_autolink
677 {
678         function Link_autolink_a($start)
679         {
680                 parent::Link_autolink($start);
681         }
682
683         function get_pattern()
684         {
685                 return isset($this->auto_a) ? '(' . $this->auto_a . ')' : FALSE;
686         }
687 }
688
689 // ¥Ú¡¼¥¸Ì¾¤Î¥ê¥ó¥¯¤òºîÀ®
690 function make_pagelink($page, $alias = '', $anchor = '', $refer = '')
691 {
692         global $script, $vars, $link_compact, $related, $_symbol_noexists;
693
694         $s_page = htmlspecialchars(strip_bracket($page));
695         $s_alias = ($alias == '') ? $s_page : $alias;
696
697         if ($page == '') return '<a href="' . $anchor . '">' . $s_alias . '</a>';
698
699         $r_page  = rawurlencode($page);
700         $r_refer = ($refer == '') ? '' : '&amp;refer=' . rawurlencode($refer);
701
702         if (! isset($related[$page]) && $page != $vars['page'] && is_page($page))
703                 $related[$page] = get_filetime($page);
704
705         if (is_page($page)) {
706                 $passage = get_pg_passage($page, FALSE);
707                 $title   = $link_compact ? '' : ' title="' . $s_page . $passage . '"';
708                 return '<a href="' . $script . '?' . $r_page . $anchor . '"' . $title . '>' .
709                         $s_alias . '</a>';
710         } else {
711                 $retval = $s_alias . '<a href="' .
712                         $script . '?cmd=edit&amp;page=' . $r_page . $r_refer . '">' .
713                         $_symbol_noexists . '</a>';
714                 if (! $link_compact)
715                         $retval = '<span class="noexists">' . $retval . '</span>';
716                 return $retval;
717         }
718 }
719
720 // Resolve relative/(Unix-like)absolute path of the page
721 function get_fullname($name, $refer)
722 {
723         global $defaultpage;
724
725         // 'Here'
726         if ($name == '' || $name == './') return $refer;
727
728         // Absolute path
729         if ($name{0} == '/') {
730                 $name = substr($name, 1);
731                 return ($name == '') ? $defaultpage : $name;
732         }
733
734         // Relative path from 'Here'
735         if (substr($name, 0, 2) == './') {
736                 $arrn    = preg_split('#/#', $name, -1, PREG_SPLIT_NO_EMPTY);
737                 $arrn[0] = $refer;
738                 return join('/', $arrn);
739         }
740
741         // Relative path from dirname()
742         if (substr($name, 0, 3) == '../') {
743                 $arrn = preg_split('#/#', $name,  -1, PREG_SPLIT_NO_EMPTY);
744                 $arrp = preg_split('#/#', $refer, -1, PREG_SPLIT_NO_EMPTY);
745
746                 while (! empty($arrn) && $arrn[0] == '..') {
747                         array_shift($arrn);
748                         array_pop($arrp);
749                 }
750                 $name = ! empty($arrp) ? join('/', array_merge($arrp, $arrn)) :
751                         (! empty($arrn) ? $defaultpage . '/' . join('/', $arrn) : $defaultpage);
752         }
753
754         return $name;
755 }
756
757 // InterWikiName¤òŸ³«
758 function get_interwiki_url($name, $param)
759 {
760         global $WikiName, $interwiki;
761         static $interwikinames;
762         static $encode_aliases = array('sjis'=>'SJIS', 'euc'=>'EUC-JP', 'utf8'=>'UTF-8');
763
764         if (! isset($interwikinames)) {
765                 $interwikinames = $matches = array();
766                 foreach (get_source($interwiki) as $line)
767                         if (preg_match('/\[(' . '(?:(?:https?|ftp|news):\/\/|\.\.?\/)' .
768                             '[!~*\'();\/?:\@&=+\$,%#\w.-]*)\s([^\]]+)\]\s?([^\s]*)/',
769                             $line, $matches))
770                                 $interwikinames[$matches[2]] = array($matches[1], $matches[3]);
771         }
772
773         if (! isset($interwikinames[$name])) return FALSE;
774
775         list($url, $opt) = $interwikinames[$name];
776
777         // Ê¸»ú¥¨¥ó¥³¡¼¥Ç¥£¥ó¥°
778         switch ($opt) {
779
780         case '':
781         case 'std': // ÆâÉôʸ»ú¥¨¥ó¥³¡¼¥Ç¥£¥ó¥°¤Î¤Þ¤ÞURL¥¨¥ó¥³¡¼¥É
782                 $param = rawurlencode($param);
783                 break;
784
785         case 'asis':
786         case 'raw':
787                 // $param = htmlspecialchars($param);
788                 break;
789
790         case 'yw': // YukiWiki
791                 if (! preg_match('/' . $WikiName . '/', $param))
792                         $param = '[[' . mb_convert_encoding($param, 'SJIS', SOURCE_ENCODING) . ']]';
793                 // $param = htmlspecialchars($param);
794                 break;
795
796         case 'moin': // MoinMoin
797                 $param = str_replace('%', '_', rawurlencode($param));
798                 break;
799
800         default:
801                 // ¥¨¥¤¥ê¥¢¥¹¤ÎÊÑ´¹
802                 if (isset($encode_aliases[$opt])) $opt = $encode_aliases[$opt];
803                 // »ØÄꤵ¤ì¤¿Ê¸»ú¥³¡¼¥É¤Ø¥¨¥ó¥³¡¼¥É¤·¤ÆURL¥¨¥ó¥³¡¼¥É
804                 $param = rawurlencode(mb_convert_encoding($param, $opt, 'auto'));
805         }
806
807         // ¥Ñ¥é¥á¡¼¥¿¤òÃÖ´¹
808         if (strpos($url, '$1') !== FALSE) {
809                 $url = str_replace('$1', $param, $url);
810         } else {
811                 $url .= $param;
812         }
813
814         $len = strlen($url);
815         if ($len > 512) die_message('InterWiki URL too long: ' . $len . ' characters');
816
817         return $url;
818 }
819 ?>