1
<?php
2
/**
3
 * Fields Plugin: Re-usable user fields
4
 *
5
 * @license    GPL 2 (http://www.gnu.org/licenses/gpl.html)
6
 * @author     Aurelien Bompard <aurelien@bompard.org>
7
 */
8
// must be run within Dokuwiki
9
if(!defined('DOKU_INC')) die();
10
11
if(!defined('DOKU_PLUGIN')) define('DOKU_PLUGIN',DOKU_INC.'lib/plugins/');
12
require_once(DOKU_PLUGIN.'syntax.php');
13
14
class syntax_plugin_fields extends DokuWiki_Syntax_Plugin {
15
16
    /**
17
     * return some info
18
     */
19
    function getInfo(){
20
        return confToHash(dirname(__FILE__).'/info.txt');
21
    }
22
23
    /**
24
     * What kind of syntax are we?
25
     */
26
    function getType(){
27
        return 'substition';
28
    }
29
30
    /**
31
     * Where to sort in?
32
     */
33
    function getSort(){
34
        return 319; // Before image detection, which uses {{...}} and is 320
35
    }
36
37
38
    /**
39
     * Connect pattern to lexer
40
     */
41
    function connectTo($mode) {
42
        $this->Lexer->addSpecialPattern('{{fields>.+?}}',$mode,'plugin_fields');
43
    }
44
45
    /**
46
     * Handle the match
47
     */
48
    function handle($match, $state, $pos, &$handler){
49
        $match = substr($match,9,-2); //strip markup
50
        $extinfo = explode('=',$match);
51
        $field_name = $extinfo[0];
52
        if (count($extinfo) < 2) { // no value
53
            $field_value = '';
54
        } elseif (count($field) == 2) {
55
            $field_value = $extinfo[1];
56
        } else { // value may contain equal signs
57
            $field_value = implode(array_slice($extinfo,1), '=');
58
        }
59
        return array($field_name, $field_value);
60
    }
61
62
    /**
63
     * Create output
64
     */
65
    function render($format, &$renderer, $data) {
66
        global $ID;
67
        list($field_name, $field_value) = $data;
68
        if ($field_value == '') { // no value -> get the field
69
            if ($format == 'xhtml' && isset($renderer->fields) 
70
                    && array_key_exists($field_name, $renderer->fields)) {
71
                $renderer->doc .= $renderer->fields[$field_name];
72
                return true;
73
            } elseif ($format == 'odt') {
74
                $renderer->doc .= $this->_fieldsODTInsertUserField($renderer, $field_name);
75
                return true;
76
            }
77
        } else {
78
            // set field
79
            if ($format == 'xhtml') {
80
                if (!isset($renderer->fields)) {
81
                    $renderer->fields = array();
82
                }
83
                $renderer->fields[$field_name] = htmlentities($field_value);
84
                return true;
85
            } elseif ($format == 'odt') {
86
                $this->_fieldsODTAddUserField($renderer, $field_name,
87
                            $renderer->_xmlEntities($field_value));
88
                return true;
89
            }
90
        }
91
        return false;
92
    }
93
94
    function _fieldsODTFilterUserFieldName($name) {
95
        // keep only allowed chars in the name
96
        return preg_replace('/[^a-zA-Z0-9_.]/', '', $name);
97
    }
98
99
    function _fieldsODTAddUserField(&$renderer, $name, $value) {
100
        $name = $this->_fieldsODTFilterUserFieldName($name);
101
        $renderer->fields[$name] = $value;
102
    }
103
104
    function _fieldsODTInsertUserField(&$renderer, $name) {
105
        $name = $this->_fieldsODTFilterUserFieldName($name);
106
        if (array_key_exists($name, $renderer->fields)) {
107
            return '<text:user-field-get text:name="'.$name.'">'.$renderer->fields[$name].'</text:user-field-get>';
108
        }
109
        return '';
110
    }
111
112
}
113
114
//Setup VIM: ex: et ts=4 fileencoding=utf-8 :