PageRenderTime 48ms CodeModel.GetById 18ms RepoModel.GetById 1ms app.codeStats 0ms

/lib/make_link.php

https://bitbucket.org/hironow/pukiwiki-skin-bootpuki
PHP | 854 lines | 683 code | 126 blank | 45 comment | 95 complexity | cb7febcfbd43ac3aed61c00761331c1f MD5 | raw file
  1. <?php
  2. // PukiWiki - Yet another WikiWikiWeb clone.
  3. // $Id: make_link.php,v 1.30 2005/12/10 07:57:30 henoheno Exp $
  4. // Copyright (C)
  5. // 2003-2005 PukiWiki Developers Team
  6. // 2001-2002 Originally written by yu-ji
  7. // License: GPL v2 or (at your option) any later version
  8. //
  9. // Hyperlink-related functions
  10. // Hyperlink decoration
  11. function make_link($string, $page = '')
  12. {
  13. global $vars;
  14. static $converter;
  15. if (! isset($converter)) $converter = new InlineConverter();
  16. $clone = $converter->get_clone($converter);
  17. return $clone->convert($string, ($page != '') ? $page : $vars['page']);
  18. }
  19. // Converters of inline element
  20. class InlineConverter
  21. {
  22. var $converters; // as array()
  23. var $pattern;
  24. var $pos;
  25. var $result;
  26. function get_clone($obj) {
  27. static $clone_func;
  28. if (! isset($clone_func)) {
  29. if (version_compare(PHP_VERSION, '5.0.0', '<')) {
  30. $clone_func = create_function('$a', 'return $a;');
  31. } else {
  32. $clone_func = create_function('$a', 'return clone $a;');
  33. }
  34. }
  35. return $clone_func($obj);
  36. }
  37. function __clone() {
  38. $converters = array();
  39. foreach ($this->converters as $key=>$converter) {
  40. $converters[$key] = $this->get_clone($converter);
  41. }
  42. $this->converters = $converters;
  43. }
  44. function InlineConverter($converters = NULL, $excludes = NULL)
  45. {
  46. if ($converters === NULL) {
  47. $converters = array(
  48. 'plugin', // Inline plugins
  49. 'note', // Footnotes
  50. 'url', // URLs
  51. 'url_interwiki', // URLs (interwiki definition)
  52. 'mailto', // mailto: URL schemes
  53. 'interwikiname', // InterWikiNames
  54. 'autolink', // AutoLinks
  55. 'bracketname', // BracketNames
  56. 'wikiname', // WikiNames
  57. 'autolink_a', // AutoLinks(alphabet)
  58. );
  59. }
  60. if ($excludes !== NULL)
  61. $converters = array_diff($converters, $excludes);
  62. $this->converters = $patterns = array();
  63. $start = 1;
  64. foreach ($converters as $name) {
  65. $classname = 'Link_' . $name;
  66. $converter = new $classname($start);
  67. $pattern = $converter->get_pattern();
  68. if ($pattern === FALSE) continue;
  69. $patterns[] = '(' . "\n" . $pattern . "\n" . ')';
  70. $this->converters[$start] = $converter;
  71. $start += $converter->get_count();
  72. ++$start;
  73. }
  74. $this->pattern = join('|', $patterns);
  75. }
  76. function convert($string, $page)
  77. {
  78. $this->page = $page;
  79. $this->result = array();
  80. $string = preg_replace_callback('/' . $this->pattern . '/x',
  81. array(& $this, 'replace'), $string);
  82. $arr = explode("\x08", make_line_rules(htmlspecialchars($string)));
  83. $retval = '';
  84. while (! empty($arr)) {
  85. $retval .= array_shift($arr) . array_shift($this->result);
  86. }
  87. return $retval;
  88. }
  89. function replace($arr)
  90. {
  91. $obj = $this->get_converter($arr);
  92. $this->result[] = ($obj !== NULL && $obj->set($arr, $this->page) !== FALSE) ?
  93. $obj->toString() : make_line_rules(htmlspecialchars($arr[0]));
  94. return "\x08"; // Add a mark into latest processed part
  95. }
  96. function get_objects($string, $page)
  97. {
  98. $matches = $arr = array();
  99. preg_match_all('/' . $this->pattern . '/x', $string, $matches, PREG_SET_ORDER);
  100. foreach ($matches as $match) {
  101. $obj = $this->get_converter($match);
  102. if ($obj->set($match, $page) !== FALSE) {
  103. $arr[] = $this->get_clone($obj);
  104. if ($obj->body != '')
  105. $arr = array_merge($arr, $this->get_objects($obj->body, $page));
  106. }
  107. }
  108. return $arr;
  109. }
  110. function & get_converter(& $arr)
  111. {
  112. foreach (array_keys($this->converters) as $start) {
  113. if ($arr[$start] == $arr[0])
  114. return $this->converters[$start];
  115. }
  116. return NULL;
  117. }
  118. }
  119. // Base class of inline elements
  120. class Link
  121. {
  122. var $start; // Origin number of parentheses (0 origin)
  123. var $text; // Matched string
  124. var $type;
  125. var $page;
  126. var $name;
  127. var $body;
  128. var $alias;
  129. // Constructor
  130. function Link($start)
  131. {
  132. $this->start = $start;
  133. }
  134. // Return a regex pattern to match
  135. function get_pattern() {}
  136. // Return number of parentheses (except (?:...) )
  137. function get_count() {}
  138. // Set pattern that matches
  139. function set($arr, $page) {}
  140. function toString() {}
  141. // Private: Get needed parts from a matched array()
  142. function splice($arr)
  143. {
  144. $count = $this->get_count() + 1;
  145. $arr = array_pad(array_splice($arr, $this->start, $count), $count, '');
  146. $this->text = $arr[0];
  147. return $arr;
  148. }
  149. // Set basic parameters
  150. function setParam($page, $name, $body, $type = '', $alias = '')
  151. {
  152. static $converter = NULL;
  153. $this->page = $page;
  154. $this->name = $name;
  155. $this->body = $body;
  156. $this->type = $type;
  157. if (! PKWK_DISABLE_INLINE_IMAGE_FROM_URI &&
  158. is_url($alias) && preg_match('/\.(gif|png|jpe?g)$/i', $alias)) {
  159. $alias = '<img src="' . htmlspecialchars($alias) . '" alt="' . $name . '" />';
  160. } else if ($alias != '') {
  161. if ($converter === NULL)
  162. $converter = new InlineConverter(array('plugin'));
  163. $alias = make_line_rules($converter->convert($alias, $page));
  164. // BugTrack/669: A hack removing anchor tags added by AutoLink
  165. $alias = preg_replace('#</?a[^>]*>#i', '', $alias);
  166. }
  167. $this->alias = $alias;
  168. return TRUE;
  169. }
  170. }
  171. // Inline plugins
  172. class Link_plugin extends Link
  173. {
  174. var $pattern;
  175. var $plain,$param;
  176. function Link_plugin($start)
  177. {
  178. parent::Link($start);
  179. }
  180. function get_pattern()
  181. {
  182. $this->pattern = <<<EOD
  183. &
  184. ( # (1) plain
  185. (\w+) # (2) plugin name
  186. (?:
  187. \(
  188. ((?:(?!\)[;{]).)*) # (3) parameter
  189. \)
  190. )?
  191. )
  192. EOD;
  193. return <<<EOD
  194. {$this->pattern}
  195. (?:
  196. \{
  197. ((?:(?R)|(?!};).)*) # (4) body
  198. \}
  199. )?
  200. ;
  201. EOD;
  202. }
  203. function get_count()
  204. {
  205. return 4;
  206. }
  207. function set($arr, $page)
  208. {
  209. list($all, $this->plain, $name, $this->param, $body) = $this->splice($arr);
  210. // Re-get true plugin name and patameters (for PHP 4.1.2)
  211. $matches = array();
  212. if (preg_match('/^' . $this->pattern . '/x', $all, $matches)
  213. && $matches[1] != $this->plain)
  214. list(, $this->plain, $name, $this->param) = $matches;
  215. return parent::setParam($page, $name, $body, 'plugin');
  216. }
  217. function toString()
  218. {
  219. $body = ($this->body == '') ? '' : make_link($this->body);
  220. $str = FALSE;
  221. // Try to call the plugin
  222. if (exist_plugin_inline($this->name))
  223. $str = do_plugin_inline($this->name, $this->param, $body);
  224. if ($str !== FALSE) {
  225. return $str; // Succeed
  226. } else {
  227. // No such plugin, or Failed
  228. $body = (($body == '') ? '' : '{' . $body . '}') . ';';
  229. return make_line_rules(htmlspecialchars('&' . $this->plain) . $body);
  230. }
  231. }
  232. }
  233. // Footnotes
  234. class Link_note extends Link
  235. {
  236. function Link_note($start)
  237. {
  238. parent::Link($start);
  239. }
  240. function get_pattern()
  241. {
  242. return <<<EOD
  243. \(\(
  244. ((?:(?R)|(?!\)\)).)*) # (1) note body
  245. \)\)
  246. EOD;
  247. }
  248. function get_count()
  249. {
  250. return 1;
  251. }
  252. function set($arr, $page)
  253. {
  254. global $foot_explain, $vars;
  255. static $note_id = 0;
  256. list(, $body) = $this->splice($arr);
  257. if (PKWK_ALLOW_RELATIVE_FOOTNOTE_ANCHOR) {
  258. $script = '';
  259. } else {
  260. $script = get_script_uri() . '?' . rawurlencode($page);
  261. }
  262. $id = ++$note_id;
  263. $note = make_link($body);
  264. $page = isset($vars['page']) ? rawurlencode($vars['page']) : '';
  265. // Footnote
  266. $foot_explain[$id] = '<a id="notefoot_' . $id . '" href="' .
  267. $script . '#notetext_' . $id . '" class="note_super">*' .
  268. $id . '</a>' . "\n" .
  269. '<span class="small">' . $note . '</span><br />';
  270. // A hyperlink, content-body to footnote
  271. if (! is_numeric(PKWK_FOOTNOTE_TITLE_MAX) || PKWK_FOOTNOTE_TITLE_MAX <= 0) {
  272. $title = '';
  273. } else {
  274. $title = strip_tags($note);
  275. $count = mb_strlen($title, SOURCE_ENCODING);
  276. $title = mb_substr($title, 0, $count, SOURCE_ENCODING); ////PKWK_FOOTNOTE_TITLE_MAX -> $count
  277. $abbr = (mb_strlen($title) < $count) ? '...' : '';
  278. $title = ' title="' . $title . $abbr . '"';
  279. }
  280. $name = '<a id="notetext_' . $id . '" href="' . $script .
  281. '#notefoot_' . $id . '" class="note_super"' . $title .
  282. '>*' . $id . '</a>';
  283. return parent::setParam($page, $name, $body);
  284. }
  285. function toString()
  286. {
  287. return $this->name;
  288. }
  289. }
  290. // URLs
  291. class Link_url extends Link
  292. {
  293. function Link_url($start)
  294. {
  295. parent::Link($start);
  296. }
  297. function get_pattern()
  298. {
  299. $s1 = $this->start + 1;
  300. return <<<EOD
  301. (\[\[ # (1) open bracket
  302. ((?:(?!\]\]).)+) # (2) alias
  303. (?:>|:)
  304. )?
  305. ( # (3) url
  306. (?:(?:https?|ftp|news):\/\/|mailto:)[\w\/\@\$()!?&%#:;.,~'=*+-]+
  307. )
  308. (?($s1)\]\]) # close bracket
  309. EOD;
  310. }
  311. function get_count()
  312. {
  313. return 3;
  314. }
  315. function set($arr, $page)
  316. {
  317. list(, , $alias, $name) = $this->splice($arr);
  318. return parent::setParam($page, htmlspecialchars($name),
  319. '', 'url', $alias == '' ? $name : $alias);
  320. }
  321. function toString()
  322. {
  323. if (FALSE) {
  324. $rel = '';
  325. } else {
  326. $rel = ' rel="nofollow"';
  327. }
  328. return '<a href="' . $this->name . '"' . $rel . '>' . $this->alias . '</a>';
  329. }
  330. }
  331. // URLs (InterWiki definition on "InterWikiName")
  332. class Link_url_interwiki extends Link
  333. {
  334. function Link_url_interwiki($start)
  335. {
  336. parent::Link($start);
  337. }
  338. function get_pattern()
  339. {
  340. return <<<EOD
  341. \[ # open bracket
  342. ( # (1) url
  343. (?:(?:https?|ftp|news):\/\/|\.\.?\/)[!~*'();\/?:\@&=+\$,%#\w.-]*
  344. )
  345. \s
  346. ([^\]]+) # (2) alias
  347. \] # close bracket
  348. EOD;
  349. }
  350. function get_count()
  351. {
  352. return 2;
  353. }
  354. function set($arr, $page)
  355. {
  356. list(, $name, $alias) = $this->splice($arr);
  357. return parent::setParam($page, htmlspecialchars($name), '', 'url', $alias);
  358. }
  359. function toString()
  360. {
  361. return '<a href="' . $this->name . '" rel="nofollow">' . $this->alias . '</a>';
  362. }
  363. }
  364. // mailto: URL schemes
  365. class Link_mailto extends Link
  366. {
  367. var $is_image, $image;
  368. function Link_mailto($start)
  369. {
  370. parent::Link($start);
  371. }
  372. function get_pattern()
  373. {
  374. $s1 = $this->start + 1;
  375. return <<<EOD
  376. (?:
  377. \[\[
  378. ((?:(?!\]\]).)+)(?:>|:) # (1) alias
  379. )?
  380. ([\w.-]+@[\w-]+\.[\w.-]+) # (2) mailto
  381. (?($s1)\]\]) # close bracket if (1)
  382. EOD;
  383. }
  384. function get_count()
  385. {
  386. return 2;
  387. }
  388. function set($arr, $page)
  389. {
  390. list(, $alias, $name) = $this->splice($arr);
  391. return parent::setParam($page, $name, '', 'mailto', $alias == '' ? $name : $alias);
  392. }
  393. function toString()
  394. {
  395. return '<a href="mailto:' . $this->name . '" rel="nofollow">' . $this->alias . '</a>';
  396. }
  397. }
  398. // InterWikiName-rendered URLs
  399. class Link_interwikiname extends Link
  400. {
  401. var $url = '';
  402. var $param = '';
  403. var $anchor = '';
  404. function Link_interwikiname($start)
  405. {
  406. parent::Link($start);
  407. }
  408. function get_pattern()
  409. {
  410. $s2 = $this->start + 2;
  411. $s5 = $this->start + 5;
  412. return <<<EOD
  413. \[\[ # open bracket
  414. (?:
  415. ((?:(?!\]\]).)+)> # (1) alias
  416. )?
  417. (\[\[)? # (2) open bracket
  418. ((?:(?!\s|:|\]\]).)+) # (3) InterWiki
  419. (?<! > | >\[\[ ) # not '>' or '>[['
  420. : # separator
  421. ( # (4) param
  422. (\[\[)? # (5) open bracket
  423. (?:(?!>|\]\]).)+
  424. (?($s5)\]\]) # close bracket if (5)
  425. )
  426. (?($s2)\]\]) # close bracket if (2)
  427. \]\] # close bracket
  428. EOD;
  429. }
  430. function get_count()
  431. {
  432. return 5;
  433. }
  434. function set($arr, $page)
  435. {
  436. global $script;
  437. list(, $alias, , $name, $this->param) = $this->splice($arr);
  438. $matches = array();
  439. if (preg_match('/^([^#]+)(#[A-Za-z][\w-]*)$/', $this->param, $matches))
  440. list(, $this->param, $this->anchor) = $matches;
  441. $url = get_interwiki_url($name, $this->param);
  442. $this->url = ($url === FALSE) ?
  443. $script . '?' . rawurlencode('[[' . $name . ':' . $this->param . ']]') :
  444. htmlspecialchars($url);
  445. return parent::setParam(
  446. $page,
  447. htmlspecialchars($name . ':' . $this->param),
  448. '',
  449. 'InterWikiName',
  450. $alias == '' ? $name . ':' . $this->param : $alias
  451. );
  452. }
  453. function toString()
  454. {
  455. return '<a href="' . $this->url . $this->anchor . '" title="' .
  456. $this->name . '" rel="nofollow">' . $this->alias . '</a>';
  457. }
  458. }
  459. // BracketNames
  460. class Link_bracketname extends Link
  461. {
  462. var $anchor, $refer;
  463. function Link_bracketname($start)
  464. {
  465. parent::Link($start);
  466. }
  467. function get_pattern()
  468. {
  469. global $WikiName, $BracketName;
  470. $s2 = $this->start + 2;
  471. return <<<EOD
  472. \[\[ # Open bracket
  473. (?:((?:(?!\]\]).)+)>)? # (1) Alias
  474. (\[\[)? # (2) Open bracket
  475. ( # (3) PageName
  476. (?:$WikiName)
  477. |
  478. (?:$BracketName)
  479. )?
  480. (\#(?:[a-zA-Z][\w-]*)?)? # (4) Anchor
  481. (?($s2)\]\]) # Close bracket if (2)
  482. \]\] # Close bracket
  483. EOD;
  484. }
  485. function get_count()
  486. {
  487. return 4;
  488. }
  489. function set($arr, $page)
  490. {
  491. global $WikiName;
  492. list(, $alias, , $name, $this->anchor) = $this->splice($arr);
  493. if ($name == '' && $this->anchor == '') return FALSE;
  494. if ($name == '' || ! preg_match('/^' . $WikiName . '$/', $name)) {
  495. if ($alias == '') $alias = $name . $this->anchor;
  496. if ($name != '') {
  497. $name = get_fullname($name, $page);
  498. if (! is_pagename($name)) return FALSE;
  499. }
  500. }
  501. return parent::setParam($page, $name, '', 'pagename', $alias);
  502. }
  503. function toString()
  504. {
  505. return make_pagelink(
  506. $this->name,
  507. $this->alias,
  508. $this->anchor,
  509. $this->page
  510. );
  511. }
  512. }
  513. // WikiNames
  514. class Link_wikiname extends Link
  515. {
  516. function Link_wikiname($start)
  517. {
  518. parent::Link($start);
  519. }
  520. function get_pattern()
  521. {
  522. global $WikiName, $nowikiname;
  523. return $nowikiname ? FALSE : '(' . $WikiName . ')';
  524. }
  525. function get_count()
  526. {
  527. return 1;
  528. }
  529. function set($arr, $page)
  530. {
  531. list($name) = $this->splice($arr);
  532. return parent::setParam($page, $name, '', 'pagename', $name);
  533. }
  534. function toString()
  535. {
  536. return make_pagelink(
  537. $this->name,
  538. $this->alias,
  539. '',
  540. $this->page
  541. );
  542. }
  543. }
  544. // AutoLinks
  545. class Link_autolink extends Link
  546. {
  547. var $forceignorepages = array();
  548. var $auto;
  549. var $auto_a; // alphabet only
  550. function Link_autolink($start)
  551. {
  552. global $autolink;
  553. parent::Link($start);
  554. if (! $autolink || ! file_exists(CACHE_DIR . 'autolink.dat'))
  555. return;
  556. @list($auto, $auto_a, $forceignorepages) = file(CACHE_DIR . 'autolink.dat');
  557. $this->auto = $auto;
  558. $this->auto_a = $auto_a;
  559. $this->forceignorepages = explode("\t", trim($forceignorepages));
  560. }
  561. function get_pattern()
  562. {
  563. return isset($this->auto) ? '(' . $this->auto . ')' : FALSE;
  564. }
  565. function get_count()
  566. {
  567. return 1;
  568. }
  569. function set($arr, $page)
  570. {
  571. global $WikiName;
  572. list($name) = $this->splice($arr);
  573. // Ignore pages listed, or Expire ones not found
  574. if (in_array($name, $this->forceignorepages) || ! is_page($name))
  575. return FALSE;
  576. return parent::setParam($page, $name, '', 'pagename', $name);
  577. }
  578. function toString()
  579. {
  580. return make_pagelink($this->name, $this->alias, '', $this->page, TRUE);
  581. }
  582. }
  583. class Link_autolink_a extends Link_autolink
  584. {
  585. function Link_autolink_a($start)
  586. {
  587. parent::Link_autolink($start);
  588. }
  589. function get_pattern()
  590. {
  591. return isset($this->auto_a) ? '(' . $this->auto_a . ')' : FALSE;
  592. }
  593. }
  594. // Make hyperlink for the page
  595. function make_pagelink($page, $alias = '', $anchor = '', $refer = '', $isautolink = FALSE)
  596. {
  597. global $script, $vars, $link_compact, $related, $_symbol_noexists;
  598. $s_page = htmlspecialchars(strip_bracket($page));
  599. $s_alias = ($alias == '') ? $s_page : $alias;
  600. if ($page == '') return '<a href="' . $anchor . '">' . $s_alias . '</a>';
  601. $r_page = rawurlencode($page);
  602. $r_refer = ($refer == '') ? '' : '&amp;refer=' . rawurlencode($refer);
  603. if (! isset($related[$page]) && $page != $vars['page'] && is_page($page))
  604. $related[$page] = get_filetime($page);
  605. if ($isautolink || is_page($page)) {
  606. // Hyperlink to the page
  607. if ($link_compact) {
  608. $title = '';
  609. } else {
  610. $title = ' title="' . $s_page . get_pg_passage($page, FALSE) . '"';
  611. }
  612. // AutoLink marker
  613. if ($isautolink) {
  614. $al_left = '<!--autolink-->';
  615. $al_right = '<!--/autolink-->';
  616. } else {
  617. $al_left = $al_right = '';
  618. }
  619. return $al_left . '<a ' . 'href="' . $script . '?' . $r_page . $anchor .
  620. '"' . $title . '>' . $s_alias . '</a>' . $al_right;
  621. } else {
  622. // Dangling link
  623. if (PKWK_READONLY) return $s_alias; // No dacorations
  624. $retval = $s_alias . '<a href="' .
  625. $script . '?cmd=edit&amp;page=' . $r_page . $r_refer . '">' .
  626. $_symbol_noexists . '</a>';
  627. if ($link_compact) {
  628. return $retval;
  629. } else {
  630. return '<span class="noexists">' . $retval . '</span>';
  631. }
  632. }
  633. }
  634. // Resolve relative / (Unix-like)absolute path of the page
  635. function get_fullname($name, $refer)
  636. {
  637. global $defaultpage;
  638. // 'Here'
  639. if ($name == '' || $name == './') return $refer;
  640. // Absolute path
  641. if ($name{0} == '/') {
  642. $name = substr($name, 1);
  643. return ($name == '') ? $defaultpage : $name;
  644. }
  645. // Relative path from 'Here'
  646. if (substr($name, 0, 2) == './') {
  647. $arrn = preg_split('#/#', $name, -1, PREG_SPLIT_NO_EMPTY);
  648. $arrn[0] = $refer;
  649. return join('/', $arrn);
  650. }
  651. // Relative path from dirname()
  652. if (substr($name, 0, 3) == '../') {
  653. $arrn = preg_split('#/#', $name, -1, PREG_SPLIT_NO_EMPTY);
  654. $arrp = preg_split('#/#', $refer, -1, PREG_SPLIT_NO_EMPTY);
  655. while (! empty($arrn) && $arrn[0] == '..') {
  656. array_shift($arrn);
  657. array_pop($arrp);
  658. }
  659. $name = ! empty($arrp) ? join('/', array_merge($arrp, $arrn)) :
  660. (! empty($arrn) ? $defaultpage . '/' . join('/', $arrn) : $defaultpage);
  661. }
  662. return $name;
  663. }
  664. // Render an InterWiki into a URL
  665. function get_interwiki_url($name, $param)
  666. {
  667. global $WikiName, $interwiki;
  668. static $interwikinames;
  669. static $encode_aliases = array('sjis'=>'SJIS', 'euc'=>'EUC-JP', 'utf8'=>'UTF-8');
  670. if (! isset($interwikinames)) {
  671. $interwikinames = $matches = array();
  672. foreach (get_source($interwiki) as $line)
  673. if (preg_match('/\[(' . '(?:(?:https?|ftp|news):\/\/|\.\.?\/)' .
  674. '[!~*\'();\/?:\@&=+\$,%#\w.-]*)\s([^\]]+)\]\s?([^\s]*)/',
  675. $line, $matches))
  676. $interwikinames[$matches[2]] = array($matches[1], $matches[3]);
  677. }
  678. if (! isset($interwikinames[$name])) return FALSE;
  679. list($url, $opt) = $interwikinames[$name];
  680. // Encoding
  681. switch ($opt) {
  682. case '': /* FALLTHROUGH */
  683. case 'std': // Simply URL-encode the string, whose base encoding is the internal-encoding
  684. $param = rawurlencode($param);
  685. break;
  686. case 'asis': /* FALLTHROUGH */
  687. case 'raw' : // Truly as-is
  688. break;
  689. case 'yw': // YukiWiki
  690. if (! preg_match('/' . $WikiName . '/', $param))
  691. $param = '[[' . mb_convert_encoding($param, 'SJIS', SOURCE_ENCODING) . ']]';
  692. break;
  693. case 'moin': // MoinMoin
  694. $param = str_replace('%', '_', rawurlencode($param));
  695. break;
  696. default:
  697. // Alias conversion of $opt
  698. if (isset($encode_aliases[$opt])) $opt = & $encode_aliases[$opt];
  699. // Encoding conversion into specified encode, and URLencode
  700. $param = rawurlencode(mb_convert_encoding($param, $opt, SOURCE_ENCODING));
  701. }
  702. // Replace or Add the parameter
  703. if (strpos($url, '$1') !== FALSE) {
  704. $url = str_replace('$1', $param, $url);
  705. } else {
  706. $url .= $param;
  707. }
  708. $len = strlen($url);
  709. if ($len > 512) die_message('InterWiki URL too long: ' . $len . ' characters');
  710. return $url;
  711. }
  712. ?>