xref: /plugin/strata/types/page.php (revision 5153720fcc1dd2b6e63035d45f7c2bc32e429371)
1*5153720fSfkaag71<?php
2*5153720fSfkaag71/**
3*5153720fSfkaag71 * @license    GPL 2 (http://www.gnu.org/licenses/gpl.html)
4*5153720fSfkaag71 * @author     Brend Wanders <b.wanders@utwente.nl>
5*5153720fSfkaag71 */
6*5153720fSfkaag71// must be run within Dokuwiki
7*5153720fSfkaag71if(!defined('DOKU_INC')) die('Meh.');
8*5153720fSfkaag71
9*5153720fSfkaag71/**
10*5153720fSfkaag71 * The page link type.
11*5153720fSfkaag71 */
12*5153720fSfkaag71class plugin_strata_type_page extends plugin_strata_type {
13*5153720fSfkaag71    function __construct() {
14*5153720fSfkaag71    }
15*5153720fSfkaag71
16*5153720fSfkaag71    function normalize($value, $hint) {
17*5153720fSfkaag71        global $ID;
18*5153720fSfkaag71
19*5153720fSfkaag71        // fragment reference special case
20*5153720fSfkaag71        if(!empty($hint) && substr($hint,-1) == '#') {
21*5153720fSfkaag71            $value = $hint.$value;
22*5153720fSfkaag71            resolve_pageid(getNS($hint),$value,$exists);
23*5153720fSfkaag71            return $value;
24*5153720fSfkaag71        }
25*5153720fSfkaag71
26*5153720fSfkaag71        $base = ($hint?:getNS($ID));
27*5153720fSfkaag71
28*5153720fSfkaag71        // check for local link, and prefix full page id
29*5153720fSfkaag71        // (local links don't get resolved by resolve_pageid)
30*5153720fSfkaag71        if(preg_match('/^#.+/',$value)) {
31*5153720fSfkaag71            $value = $ID.$value;
32*5153720fSfkaag71        }
33*5153720fSfkaag71
34*5153720fSfkaag71        // resolve page id with respect to selected base
35*5153720fSfkaag71        resolve_pageid($base,$value,$exists);
36*5153720fSfkaag71
37*5153720fSfkaag71        // if the value is empty after resolving, it is a reference to the
38*5153720fSfkaag71        // root starting page. (We can not put the emtpy string into the
39*5153720fSfkaag71        // database as a normalized reference -- this will create problems)
40*5153720fSfkaag71        if($value == '') {
41*5153720fSfkaag71            global $conf;
42*5153720fSfkaag71            $value = $conf['start'];
43*5153720fSfkaag71        }
44*5153720fSfkaag71
45*5153720fSfkaag71        return $value;
46*5153720fSfkaag71    }
47*5153720fSfkaag71
48*5153720fSfkaag71    function render($mode, &$R, &$T, $value, $hint) {
49*5153720fSfkaag71        // render internal link
50*5153720fSfkaag71        // (':' is prepended to make sure we use an absolute pagename,
51*5153720fSfkaag71        // internallink resolves page names, but the name is already resolved.)
52*5153720fSfkaag71        $R->internallink(':'.$value);
53*5153720fSfkaag71    }
54*5153720fSfkaag71
55*5153720fSfkaag71    function getInfo() {
56*5153720fSfkaag71        return array(
57*5153720fSfkaag71            'desc'=>'Links to a wiki page. The optional hint is treated as namespace for the link. If the hint ends with a #, all values will be treated as fragments.',
58*5153720fSfkaag71            'hint'=>'namespace'
59*5153720fSfkaag71        );
60*5153720fSfkaag71    }
61*5153720fSfkaag71}
62