OSDN Git Service

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