PageRenderTime 46ms CodeModel.GetById 20ms RepoModel.GetById 1ms app.codeStats 0ms

/public_html/plugin/rename.inc.php

https://bitbucket.org/kumagi/fluxflex_pukiwiki
PHP | 425 lines | 343 code | 64 blank | 18 comment | 78 complexity | f0c37a83ffa40f756bac6a10bab4ed12 MD5 | raw file
Possible License(s): GPL-2.0
  1. <?php
  2. // PukiWiki - Yet another WikiWikiWeb clone
  3. // $Id: rename.inc.php,v 1.27 2005/02/27 07:57:26 henoheno Exp $
  4. //
  5. // Rename plugin: Rename page-name and related data
  6. //
  7. // Usage: http://path/to/pukiwikiphp?plugin=rename[&refer=page_name]
  8. define('PLUGIN_RENAME_LOGPAGE', ':RenameLog');
  9. function plugin_rename_action()
  10. {
  11. global $whatsnew;
  12. if (PKWK_READONLY) die_message('PKWK_READONLY prohibits this');
  13. $method = plugin_rename_getvar('method');
  14. if ($method == 'regex') {
  15. $src = plugin_rename_getvar('src');
  16. if ($src == '') return plugin_rename_phase1();
  17. $src_pattern = '/' . preg_quote($src, '/') . '/';
  18. $arr0 = preg_grep($src_pattern, get_existpages());
  19. if (! is_array($arr0) || empty($arr0))
  20. return plugin_rename_phase1('nomatch');
  21. $dst = plugin_rename_getvar('dst');
  22. $arr1 = preg_replace($src_pattern, $dst, $arr0);
  23. foreach ($arr1 as $page)
  24. if (! is_pagename($page))
  25. return plugin_rename_phase1('notvalid');
  26. return plugin_rename_regex($arr0, $arr1);
  27. } else {
  28. // $method == 'page'
  29. $page = plugin_rename_getvar('page');
  30. $refer = plugin_rename_getvar('refer');
  31. if ($refer == '') {
  32. return plugin_rename_phase1();
  33. } else if (! is_page($refer)) {
  34. return plugin_rename_phase1('notpage', $refer);
  35. } else if ($refer == $whatsnew) {
  36. return plugin_rename_phase1('norename', $refer);
  37. } else if ($page == '' || $page == $refer) {
  38. return plugin_rename_phase2();
  39. } else if (! is_pagename($page)) {
  40. return plugin_rename_phase2('notvalid');
  41. } else {
  42. return plugin_rename_refer();
  43. }
  44. }
  45. }
  46. // 変数を取得する
  47. function plugin_rename_getvar($key)
  48. {
  49. global $vars;
  50. return isset($vars[$key]) ? $vars[$key] : '';
  51. }
  52. // エラーメッセージを作る
  53. function plugin_rename_err($err, $page = '')
  54. {
  55. global $_rename_messages;
  56. if ($err == '') return '';
  57. $body = $_rename_messages['err_' . $err];
  58. if (is_array($page)) {
  59. $tmp = '';
  60. foreach ($page as $_page) $tmp .= '<br />' . $_page;
  61. $page = $tmp;
  62. }
  63. if ($page != '') $body = sprintf($body, htmlspecialchars($page));
  64. $msg = sprintf($_rename_messages['err'], $body);
  65. return $msg;
  66. }
  67. //第一段階:ページ名または正規表現の入力
  68. function plugin_rename_phase1($err = '', $page = '')
  69. {
  70. global $script, $_rename_messages;
  71. $msg = plugin_rename_err($err, $page);
  72. $refer = plugin_rename_getvar('refer');
  73. $method = plugin_rename_getvar('method');
  74. $radio_regex = $radio_page = '';
  75. if ($method == 'regex') {
  76. $radio_regex = ' checked="checked"';
  77. } else {
  78. $radio_page = ' checked="checked"';
  79. }
  80. $select_refer = plugin_rename_getselecttag($refer);
  81. $s_src = htmlspecialchars(plugin_rename_getvar('src'));
  82. $s_dst = htmlspecialchars(plugin_rename_getvar('dst'));
  83. $ret = array();
  84. $ret['msg'] = $_rename_messages['msg_title'];
  85. $ret['body'] = <<<EOD
  86. $msg
  87. <form action="$script" method="post">
  88. <div>
  89. <input type="hidden" name="plugin" value="rename" />
  90. <input type="radio" name="method" id="_p_rename_page" value="page"$radio_page />
  91. <label for="_p_rename_page">{$_rename_messages['msg_page']}:</label>$select_refer<br />
  92. <input type="radio" name="method" id="_p_rename_regex" value="regex"$radio_regex />
  93. <label for="_p_rename_regex">{$_rename_messages['msg_regex']}:</label><br />
  94. <label for="_p_rename_from">From:</label><br />
  95. <input type="text" name="src" id="_p_rename_from" size="80" value="$s_src" /><br />
  96. <label for="_p_rename_to">To:</label><br />
  97. <input type="text" name="dst" id="_p_rename_to" size="80" value="$s_dst" /><br />
  98. <input type="submit" value="{$_rename_messages['btn_next']}" /><br />
  99. </div>
  100. </form>
  101. EOD;
  102. return $ret;
  103. }
  104. //第二段階:新しい名前の入力
  105. function plugin_rename_phase2($err = '')
  106. {
  107. global $script, $_rename_messages;
  108. $msg = plugin_rename_err($err);
  109. $page = plugin_rename_getvar('page');
  110. $refer = plugin_rename_getvar('refer');
  111. if ($page == '') $page = $refer;
  112. $msg_related = '';
  113. $related = plugin_rename_getrelated($refer);
  114. if (! empty($related))
  115. $msg_related = '<label for="_p_rename_related">' . $_rename_messages['msg_do_related'] . '</label>' .
  116. '<input type="checkbox" name="related" id="_p_rename_related" value="1" checked="checked" /><br />';
  117. $msg_rename = sprintf($_rename_messages['msg_rename'], make_pagelink($refer));
  118. $s_page = htmlspecialchars($page);
  119. $s_refer = htmlspecialchars($refer);
  120. $ret = array();
  121. $ret['msg'] = $_rename_messages['msg_title'];
  122. $ret['body'] = <<<EOD
  123. $msg
  124. <form action="$script" method="post">
  125. <div>
  126. <input type="hidden" name="plugin" value="rename" />
  127. <input type="hidden" name="refer" value="$s_refer" />
  128. $msg_rename<br />
  129. <label for="_p_rename_newname">{$_rename_messages['msg_newname']}:</label>
  130. <input type="text" name="page" id="_p_rename_newname" size="80" value="$s_page" /><br />
  131. $msg_related
  132. <input type="submit" value="{$_rename_messages['btn_next']}" /><br />
  133. </div>
  134. </form>
  135. EOD;
  136. if (! empty($related)) {
  137. $ret['body'] .= '<hr /><p>' . $_rename_messages['msg_related'] . '</p><ul>';
  138. sort($related);
  139. foreach ($related as $name)
  140. $ret['body'] .= '<li>' . make_pagelink($name) . '</li>';
  141. $ret['body'] .= '</ul>';
  142. }
  143. return $ret;
  144. }
  145. //ページ名と関連するページを列挙し、phase3へ
  146. function plugin_rename_refer()
  147. {
  148. $page = plugin_rename_getvar('page');
  149. $refer = plugin_rename_getvar('refer');
  150. $pages[encode($refer)] = encode($page);
  151. if (plugin_rename_getvar('related') != '') {
  152. $from = strip_bracket($refer);
  153. $to = strip_bracket($page);
  154. foreach (plugin_rename_getrelated($refer) as $_page)
  155. $pages[encode($_page)] = encode(str_replace($from, $to, $_page));
  156. }
  157. return plugin_rename_phase3($pages);
  158. }
  159. //正規表現でページを置換
  160. function plugin_rename_regex($arr_from, $arr_to)
  161. {
  162. $exists = array();
  163. foreach ($arr_to as $page)
  164. if (is_page($page))
  165. $exists[] = $page;
  166. if (! empty($exists)) {
  167. return plugin_rename_phase1('already', $exists);
  168. } else {
  169. $pages = array();
  170. foreach ($arr_from as $refer)
  171. $pages[encode($refer)] = encode(array_shift($arr_to));
  172. return plugin_rename_phase3($pages);
  173. }
  174. }
  175. function plugin_rename_phase3($pages)
  176. {
  177. global $script, $_rename_messages;
  178. $msg = $input = '';
  179. $files = plugin_rename_get_files($pages);
  180. $exists = array();
  181. foreach ($files as $_page=>$arr)
  182. foreach ($arr as $old=>$new)
  183. if (file_exists($new))
  184. $exists[$_page][$old] = $new;
  185. $pass = plugin_rename_getvar('pass');
  186. if ($pass != '' && pkwk_login($pass)) {
  187. return plugin_rename_proceed($pages, $files, $exists);
  188. } else if ($pass != '') {
  189. $msg = plugin_rename_err('adminpass');
  190. }
  191. $method = plugin_rename_getvar('method');
  192. if ($method == 'regex') {
  193. $s_src = htmlspecialchars(plugin_rename_getvar('src'));
  194. $s_dst = htmlspecialchars(plugin_rename_getvar('dst'));
  195. $msg .= $_rename_messages['msg_regex'] . '<br />';
  196. $input .= '<input type="hidden" name="method" value="regex" />';
  197. $input .= '<input type="hidden" name="src" value="' . $s_src . '" />';
  198. $input .= '<input type="hidden" name="dst" value="' . $s_dst . '" />';
  199. } else {
  200. $s_refer = htmlspecialchars(plugin_rename_getvar('refer'));
  201. $s_page = htmlspecialchars(plugin_rename_getvar('page'));
  202. $s_related = htmlspecialchars(plugin_rename_getvar('related'));
  203. $msg .= $_rename_messages['msg_page'] . '<br />';
  204. $input .= '<input type="hidden" name="method" value="page" />';
  205. $input .= '<input type="hidden" name="refer" value="' . $s_refer . '" />';
  206. $input .= '<input type="hidden" name="page" value="' . $s_page . '" />';
  207. $input .= '<input type="hidden" name="related" value="' . $s_related . '" />';
  208. }
  209. if (! empty($exists)) {
  210. $msg .= $_rename_messages['err_already_below'] . '<ul>';
  211. foreach ($exists as $page=>$arr) {
  212. $msg .= '<li>' . make_pagelink(decode($page));
  213. $msg .= $_rename_messages['msg_arrow'];
  214. $msg .= htmlspecialchars(decode($pages[$page]));
  215. if (! empty($arr)) {
  216. $msg .= '<ul>' . "\n";
  217. foreach ($arr as $ofile=>$nfile)
  218. $msg .= '<li>' . $ofile .
  219. $_rename_messages['msg_arrow'] . $nfile . '</li>' . "\n";
  220. $msg .= '</ul>';
  221. }
  222. $msg .= '</li>' . "\n";
  223. }
  224. $msg .= '</ul><hr />' . "\n";
  225. $input .= '<input type="radio" name="exist" value="0" checked="checked" />' .
  226. $_rename_messages['msg_exist_none'] . '<br />';
  227. $input .= '<input type="radio" name="exist" value="1" />' .
  228. $_rename_messages['msg_exist_overwrite'] . '<br />';
  229. }
  230. $ret = array();
  231. $ret['msg'] = $_rename_messages['msg_title'];
  232. $ret['body'] = <<<EOD
  233. <p>$msg</p>
  234. <form action="$script" method="post">
  235. <div>
  236. <input type="hidden" name="plugin" value="rename" />
  237. $input
  238. <label for="_p_rename_adminpass">{$_rename_messages['msg_adminpass']}</label>
  239. <input type="password" name="pass" id="_p_rename_adminpass" value="" />
  240. <input type="submit" value="{$_rename_messages['btn_submit']}" />
  241. </div>
  242. </form>
  243. <p>{$_rename_messages['msg_confirm']}</p>
  244. EOD;
  245. ksort($pages);
  246. $ret['body'] .= '<ul>' . "\n";
  247. foreach ($pages as $old=>$new)
  248. $ret['body'] .= '<li>' . make_pagelink(decode($old)) .
  249. $_rename_messages['msg_arrow'] .
  250. htmlspecialchars(decode($new)) . '</li>' . "\n";
  251. $ret['body'] .= '</ul>' . "\n";
  252. return $ret;
  253. }
  254. function plugin_rename_get_files($pages)
  255. {
  256. $files = array();
  257. $dirs = array(BACKUP_DIR, DIFF_DIR, DATA_DIR);
  258. if (exist_plugin_convert('attach')) $dirs[] = UPLOAD_DIR;
  259. if (exist_plugin_convert('counter')) $dirs[] = COUNTER_DIR;
  260. // and more ...
  261. $matches = array();
  262. foreach ($dirs as $path) {
  263. $dir = opendir($path);
  264. if (! $dir) continue;
  265. while ($file = readdir($dir)) {
  266. if ($file == '.' || $file == '..') continue;
  267. foreach ($pages as $from=>$to) {
  268. $pattern = '/^' . str_replace('/', '\/', $from) . '([._].+)$/';
  269. if (! preg_match($pattern, $file, $matches))
  270. continue;
  271. $newfile = $to . $matches[1];
  272. $files[$from][$path . $file] = $path . $newfile;
  273. }
  274. }
  275. }
  276. return $files;
  277. }
  278. function plugin_rename_proceed($pages, $files, $exists)
  279. {
  280. global $now, $_rename_messages;
  281. if (plugin_rename_getvar('exist') == '')
  282. foreach ($exists as $key=>$arr)
  283. unset($files[$key]);
  284. set_time_limit(0);
  285. foreach ($files as $page=>$arr) {
  286. foreach ($arr as $old=>$new) {
  287. if (isset($exists[$page][$old]) && $exists[$page][$old])
  288. unlink($new);
  289. rename($old, $new);
  290. // linkデータベースを更新する BugTrack/327 arino
  291. links_update($old);
  292. links_update($new);
  293. }
  294. }
  295. $postdata = get_source(PLUGIN_RENAME_LOGPAGE);
  296. $postdata[] = '*' . $now . "\n";
  297. if (plugin_rename_getvar('method') == 'regex') {
  298. $postdata[] = '-' . $_rename_messages['msg_regex'] . "\n";
  299. $postdata[] = '--From:[[' . plugin_rename_getvar('src') . ']]' . "\n";
  300. $postdata[] = '--To:[[' . plugin_rename_getvar('dst') . ']]' . "\n";
  301. } else {
  302. $postdata[] = '-' . $_rename_messages['msg_page'] . "\n";
  303. $postdata[] = '--From:[[' . plugin_rename_getvar('refer') . ']]' . "\n";
  304. $postdata[] = '--To:[[' . plugin_rename_getvar('page') . ']]' . "\n";
  305. }
  306. if (! empty($exists)) {
  307. $postdata[] = "\n" . $_rename_messages['msg_result'] . "\n";
  308. foreach ($exists as $page=>$arr) {
  309. $postdata[] = '-' . decode($page) .
  310. $_rename_messages['msg_arrow'] . decode($pages[$page]) . "\n";
  311. foreach ($arr as $ofile=>$nfile)
  312. $postdata[] = '--' . $ofile .
  313. $_rename_messages['msg_arrow'] . $nfile . "\n";
  314. }
  315. $postdata[] = '----' . "\n";
  316. }
  317. foreach ($pages as $old=>$new)
  318. $postdata[] = '-' . decode($old) .
  319. $_rename_messages['msg_arrow'] . decode($new) . "\n";
  320. // 更新の衝突はチェックしない。
  321. // ファイルの書き込み
  322. page_write(PLUGIN_RENAME_LOGPAGE, join('', $postdata));
  323. //リダイレクト
  324. $page = plugin_rename_getvar('page');
  325. if ($page == '') $page = PLUGIN_RENAME_LOGPAGE;
  326. pkwk_headers_sent();
  327. header('Location: ' . get_script_uri() . '?' . rawurlencode($page));
  328. exit;
  329. }
  330. function plugin_rename_getrelated($page)
  331. {
  332. $related = array();
  333. $pages = get_existpages();
  334. $pattern = '/(?:^|\/)' . preg_quote(strip_bracket($page), '/') . '(?:\/|$)/';
  335. foreach ($pages as $name) {
  336. if ($name == $page) continue;
  337. if (preg_match($pattern, $name)) $related[] = $name;
  338. }
  339. return $related;
  340. }
  341. function plugin_rename_getselecttag($page)
  342. {
  343. global $whatsnew;
  344. $pages = array();
  345. foreach (get_existpages() as $_page) {
  346. if ($_page == $whatsnew) continue;
  347. $selected = ($_page == $page) ? ' selected' : '';
  348. $s_page = htmlspecialchars($_page);
  349. $pages[$_page] = '<option value="' . $s_page . '"' . $selected . '>' .
  350. $s_page . '</option>';
  351. }
  352. ksort($pages);
  353. $list = join("\n" . ' ', $pages);
  354. return <<<EOD
  355. <select name="refer">
  356. <option value=""></option>
  357. $list
  358. </select>
  359. EOD;
  360. }
  361. ?>