OSDN Git Service

BugTrack/2213 Set Absolute URI or Root relative path
[pukiwiki/pukiwiki.git] / plugin / include.inc.php
index 543afc0..b8b08f2 100644 (file)
 <?php
-/*
- include.inc.php
- ¥Ú¡¼¥¸¤ò¥¤¥ó¥¯¥ë¡¼¥É¤¹¤ë
-*/
+// PukiWiki - Yet another WikiWikiWeb clone.
+// $Id: include.inc.php,v 1.23 2011/01/25 15:01:01 henoheno Exp $
+//
+// Include-once plugin
+
+//--------
+//     | PageA
+//     |
+//     | // #include(PageB)
+//     ---------
+//             | PageB
+//             |
+//             | // #include(PageC)
+//             ---------
+//                     | PageC
+//                     |
+//             --------- // PageC end
+//             |
+//             | // #include(PageD)
+//             ---------
+//                     | PageD
+//                     |
+//             --------- // PageD end
+//             |
+//     --------- // PageB end
+//     |
+//     | #include(): Included already: PageC
+//     |
+//     | // #include(PageE)
+//     ---------
+//             | PageE
+//             |
+//     --------- // PageE end
+//     |
+//     | #include(): Limit exceeded: PageF
+//     | // When PLUGIN_INCLUDE_MAX == 4
+//     |
+//     |
+//-------- // PageA end
+
+// ----
+
+// Default value of 'title|notitle' option
+define('PLUGIN_INCLUDE_WITH_TITLE', TRUE);     // Default: TRUE(title)
+
+// Max pages allowed to be included at a time
+define('PLUGIN_INCLUDE_MAX', 4);
+
+// ----
+define('PLUGIN_INCLUDE_USAGE', '#include(): Usage: (a-page-name-you-want-to-include[,title|,notitle])');
 
 function plugin_include_convert()
 {
-       global $script,$vars,$get,$post,$hr,$WikiName,$BracketName;
-       global $include_list; //½èÍýºÑ¥Ú¡¼¥¸Ì¾¤ÎÇÛÎó
-       
-       if (!isset($include_list)) {
-               $include_list = array($vars['page']=>TRUE);
-       }
-       
-       if (func_num_args() == 0) {
-               return;
+       global $script, $vars, $get, $post, $menubar, $_msg_include_restrict;
+       static $included = array();
+       static $count = 1;
+
+       if (func_num_args() == 0) return PLUGIN_INCLUDE_USAGE . '<br />' . "\n";;
+
+       // $menubar will already be shown via menu plugin
+       if (! isset($included[$menubar])) $included[$menubar] = TRUE;
+
+       // Loop yourself
+       $root = isset($vars['page']) ? $vars['page'] : '';
+       $included[$root] = TRUE;
+
+       // Get arguments
+       $args = func_get_args();
+       // strip_bracket() is not necessary but compatible
+       $page = isset($args[0]) ? get_fullname(strip_bracket(array_shift($args)), $root) : '';
+       $with_title = PLUGIN_INCLUDE_WITH_TITLE;
+       if (isset($args[0])) {
+               switch(strtolower(array_shift($args))) {
+               case 'title'  : $with_title = TRUE;  break;
+               case 'notitle': $with_title = FALSE; break;
+               }
        }
-       
-       list($page) = func_get_args();
-       $page = strip_bracket($page);
-       
-       if (!is_page($page) or isset($include_list[$page])) {
-               return '';
+
+       $s_page = htmlsc($page);
+       $r_page = pagename_urlencode($page);
+       $link = '<a href="' . $script . '?' . $r_page . '">' . $s_page . '</a>'; // Read link
+
+       // I'm stuffed
+       if (isset($included[$page])) {
+               return '#include(): Included already: ' . $link . '<br />' . "\n";
+       } if (! is_page($page)) {
+               return '#include(): No such page: ' . $s_page . '<br />' . "\n";
+       } if ($count > PLUGIN_INCLUDE_MAX) {
+               return '#include(): Limit exceeded: ' . $link . '<br />' . "\n";
+       } else {
+               ++$count;
        }
-       $include_list[$page] = TRUE;
-       
-       $_page = $vars['page'];
+
+       // One page, only one time, at a time
+       $included[$page] = TRUE;
+
+       // Include A page, that probably includes another pages
        $get['page'] = $post['page'] = $vars['page'] = $page;
-       $body = convert_html(get_source($page));
-       $get['page'] = $post['page'] = $vars['page'] = $_page;
-       
-       $s_page = htmlspecialchars($page);
-       $r_page = rawurlencode($page);
-       $link = "<a href=\"$script?cmd=edit&amp;page=$r_page\">$s_page</a>";
-       if ($page == 'MenuBar') {
-               $body = <<<EOD
-<span align="center"><h5 class="side_label">$link</h5></span>
-<small>$body</small>
-EOD;
+       if (check_readable($page, false, false)) {
+               $body = convert_html(get_source($page));
+       } else {
+               $body = str_replace('$1', $page, $_msg_include_restrict);
        }
-       else {
-               $body = "<h1>$link</h1>\n$body\n";
+       $get['page'] = $post['page'] = $vars['page'] = $root;
+
+       // Put a title-with-edit-link, before including document
+       if ($with_title) {
+               $link = '<a href="' . $script . '?cmd=edit&amp;page=' . $r_page .
+                       '">' . $s_page . '</a>';
+               if ($page === $menubar) {
+                       $body = '<span align="center"><h5 class="side_label">' .
+                               $link . '</h5></span><small>' . $body . '</small>';
+               } else {
+                       $body = '<h1>' . $link . '</h1>' . "\n" . $body . "\n";
+               }
        }
-       
+
        return $body;
 }
-?>
+