It's better when it's simple

User Tools

Site Tools


Include User Page Plugin

Compatible with DokuWiki


plugin Includes a page based on a namespace and the user name of a logged in user.

Last updated on

The missing download url means that this extension cannot be installed via the Extension Manager. Please see Publishing a Plugin on Recommended are public repository hosts like GitHub, GitLab or Bitbucket.

This extension has not been updated in over 2 years. It may no longer be maintained or supported and may have compatibility issues.

Similar to include

Tagged with !maybe.broken, include, users


This plugin is useful when you want to have a home page with some generic base text and add more text depending on the user. The most basic syntax, to include the user page from the same namespace is:


You may also include the page from a different namespace: {{userpage>namespace}}. The namespaces shortcuts do also work: {{userpage>:}} (top namespace) or {{userpage>.namespace}} (subnamespace).

Optionally you can limit the included page to a specific section (including its subsections):



To install, put the following PHP file in /lib/plugins/includeuserpage/syntax.php.

 * Include User Page Plugin: displays a wiki page within another based on the user name
 * Based on the Include Plugin from Esther Brunner available at
 * Usage:
 * Top &gt; &gt; for the user page in same namespace
 * {{userpage>:}} for the user page in top namespace
 * {{userpage>namespace}} for the user page in namespace "namespace"
 * {{userpage>.namespace}} for the user page in subnamespace "namespace" 
 * {{userpage>#section}} for the section 
 * @license    GPL 2 (
 * @author     Jean-Marc Lagace <>
if(!defined('DOKU_INC')) define('DOKU_INC',realpath(dirname(__FILE__).'/../../').'/');
if(!defined('DOKU_PLUGIN')) define('DOKU_PLUGIN',DOKU_INC.'lib/plugins/');
 * All DokuWiki plugins to extend the parser/rendering mechanism
 * need to inherit from this class
class syntax_plugin_includeuserpage extends DokuWiki_Syntax_Plugin {
     * return some info
    function getInfo(){
        return array(
            'author' => 'Jean-Marc Lagace',
            'email'  => '',
            'date'   => '2005-12-17',
            'name'   => 'Include Plugin using the UserName',
            'desc'   => 'Displays a wiki page within another based on the UserName of the connected user.  Based on a plugin by Esther Brunner available at',
            'url'    => '',
     * What kind of syntax are we?
    function getType(){
        return 'substition';
     * Where to sort in?
    function getSort(){
        return 303;
     * Paragraph Type
    function getPType(){
        return 'block';
     * Connect pattern to lexer
    function connectTo($mode) {
     * Handle the match
    function handle($match, $state, $pos, &$handler){
        $match = substr($match,11,-2);                 // strip markup
        $match = preg_split('/\#/u',$match,2);        // split hash from filename
        return array($match[0],cleanID($match[1]));
    function getPageName($namespaceSettings){
        global $_SERVER;
        if ($namespaceSettings == ':') {
                return $namespaceSettings . $_SERVER['REMOTE_USER'];
        } else {
                return $namespaceSettings . ':' .  $_SERVER['REMOTE_USER'];
     * Create output
    function render($mode, &$renderer, $data) {
        global $ID;        
        if($mode == 'xhtml'){
        		// prevent caching to ensure the included page is always fresh
            $renderer->info['cache'] = FALSE;
            $pagename = $this->getPageName($data[0]);
            resolve_pageid(getNS($ID),$pagename,$exists); // resolve shortcuts 
            // check for existence and permission
            if ((!$exists) || (auth_quickaclcheck($pagename) < 1)) return false;
            $file = wikiFN($pagename);
            if (!@file_exists($file)) return false;
            // get instructions
            $instr = p_cached_instructions($file, false);
            // filter section if given
            if ($data[1]) $instr = $this->_getSection($data[1],$instr);
            // correct relative internal links and media
            $instr = $this->_correctRelNS($instr, $pagename);
            // render the instructructions on the fly
            $text = p_render('xhtml',$instr,$info);
            // remove toc, section edit buttons and category tags
            $patterns = array('!<div class="toc">.*?(</div>\n</div>)!s',
                              '#<!-- SECTION \[(\d*-\d*)\] -->#e',
                              '!<div class="category">.*?</div>!s');
            $replace  = array('','','');
            $text = preg_replace($patterns,$replace,$text);
        		// prevent caching to ensure the included page is always fresh
            $renderer->info['cache'] = FALSE;
            // embed the included page
            $renderer->doc .= '<div class="includeuserpage">';
            $renderer->doc .= $text;
            $renderer->doc .= '</div>';
            return true;
        return false;
     * Get a section including its subsections
    function _getSection($title,$instructions){
        foreach ($instructions as $instruction){
            if ($instruction[0] == 'header'){
                // found the right header
                if (cleanID($instruction[1][0]) == $title){
                    $level = $instruction[1][1];
                    $i[] = $instruction;
                // next header of the same level -> exit
                } elseif ($instruction[1][1] == $level){
                    return $i;
            // add instructions from our section
            } elseif (isset($level)){
                $i[] = $instruction;
        return $i;
     * Corrects relative internal links and media
    function _correctRelNS($instr,$incl){
        global $ID;
        // check if included page is in same namespace
        $iNS = getNS($incl);
        if (getNS($ID) == $iNS) return $instr;
        // convert internal links and media from relative to absolute
        $n = count($instr);
        for($i = 0; $i < $n; $i++){
            if (substr($instr[$i][0], 0, 8) == 'internal'){
                // relative subnamespace
                if ($instr[$i][1][0]{0} == '.'){
                    $instr[$i][1][0] = $iNS.':'.substr($instr[$i][1][0], 1);
                // relative link
                } elseif (strpos($instr[$i][1][0],':') === false) {
                    $instr[$i][1][0] = $iNS.':'.$instr[$i][1][0];
        return $instr;
//Setup VIM: ex: et ts=4 enc=utf-8 :


The included page is set into a <div> tag of class include. So you can for example draw a border and change font size with CSS:

.includeuserpage {
    padding: 0.5em;
    border: 1px dotted #8cacbb;
    font-size: 90%;


  • 2005-12-18:
    • Original publication of the plugin. Thanks to Esther Brunner for the original code of the include plugin.



User Group Instead

Can this be changed to match a page on the user group of the signed on user? It could but based on this macro feature request I've seen on the original include plugin I think I'd drop this plugin and focus on improving the original plugin.

Demo or Playground

Is there a demo page or a playground using this plugin? — Sebastian Spiess 2007-10-10 08:04

plugin/includeuserpage.txt · Last modified: 2012-05-19 12:52 by Michitux

Except where otherwise noted, content on this wiki is licensed under the following license: CC Attribution-Share Alike 4.0 International
CC Attribution-Share Alike 4.0 International Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki