DokuWiki

It's better when it's simple

User Tools

Site Tools


plugin:includeuserpage

Include User Page Plugin

Compatible with DokuWiki

2006-11-06

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

Last updated on
2005-12-17
Provides
Syntax

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

Description

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:

{{userpage>.}}

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):

{{userpage>#sectionname}}

Plugin

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

<?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 http://www.dokuwiki.org/plugin:include
 * 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 (http://www.gnu.org/licenses/gpl.html)
 * @author     Jean-Marc Lagace <jean-marc.lagace@m2i3.com>
 */
 
if(!defined('DOKU_INC')) define('DOKU_INC',realpath(dirname(__FILE__).'/../../').'/');
if(!defined('DOKU_PLUGIN')) define('DOKU_PLUGIN',DOKU_INC.'lib/plugins/');
require_once(DOKU_PLUGIN.'syntax.php');
 
/**
 * 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'  => 'jean-marc.lagace@m2i3.com',
            '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 http://www.dokuwiki.org/plugin:include',
            'url'    => 'http://www.dokuwiki.org/plugin:includeuserpage',
        );
    }
 
    /**
     * 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) {
      $this->Lexer->addSpecialPattern("{{userpage>.+?}}",$mode,'plugin_includeuserpage');
    }
 
    /**
     * 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 :
?>

Style

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%;
}

Changes

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

Discussion

Suggestion

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