Subversion Repositories Applications.papyrus

Rev

Go to most recent revision | Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
178 jpm 1
<?php
2
/*vim: set expandtab tabstop=4 shiftwidth=4: */
3
// +------------------------------------------------------------------------------------------------------+
4
// | PHP version 4.3                                                                                      |
5
// +------------------------------------------------------------------------------------------------------+
6
// | Copyright (C) 2004 Tela Botanica (accueil@tela-botanica.org)                                         |
7
// +------------------------------------------------------------------------------------------------------+
8
// | This file is part of Papyrus.                                                                        |
9
// |                                                                                                      |
10
// | Foobar is free software; you can redistribute it and/or modify                                       |
11
// | it under the terms of the GNU General Public License as published by                                 |
12
// | the Free Software Foundation; either version 2 of the License, or                                    |
13
// | (at your option) any later version.                                                                  |
14
// |                                                                                                      |
15
// | Foobar is distributed in the hope that it will be useful,                                            |
16
// | but WITHOUT ANY WARRANTY; without even the implied warranty of                                       |
17
// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the                                        |
18
// | GNU General Public License for more details.                                                         |
19
// |                                                                                                      |
20
// | You should have received a copy of the GNU General Public License                                    |
21
// | along with Foobar; if not, write to the Free Software                                                |
22
// | Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA                            |
23
// +------------------------------------------------------------------------------------------------------+
24
// CVS : $Id: Papyrus.class.php,v 1.1 2004-11-26 12:11:49 jpm Exp $
25
/**
26
* Classe configurant le formatage pour Papyrus.
27
*
28
* Ce fichier contient une classe configurant les règles de formatage de Papyrus.
29
* Nécessite que l'application appelant ce fichier est précédement inclu le fichier de Pear:
30
* 'Text/Wiki.php';
31
*
32
*@package Text_Wiki
33
*@subpackage Papyrus
34
//Auteur original :
35
*@author        Jean-Pascal MILCENT <jpm@tela-botanica.org>
36
//Autres auteurs :
37
*@author        Aucun
38
*@copyright     Tela-Botanica 2000-2004
39
*@version       $Revision: 1.1 $ $Date: 2004-11-26 12:11:49 $
40
// +------------------------------------------------------------------------------------------------------+
41
*/
42
 
43
// +------------------------------------------------------------------------------------------------------+
44
// |                                            ENTETE du PROGRAMME                                       |
45
// +------------------------------------------------------------------------------------------------------+
46
 
47
// +------------------------------------------------------------------------------------------------------+
48
// |                                            CORPS du PROGRAMME                                        |
49
// +------------------------------------------------------------------------------------------------------+
50
/**
51
*
52
* Parse structured wiki text and render into arbitrary formats such as XHTML.
53
*
54
* Cette classe fille permet de configurer les régles de formatage pour Papyrus.
55
* Généralement nous avons à faire à des actions.
56
*
57
* @author Paul M. Jones <pmjones@ciaweb.net>
58
* @package Text_Wiki
59
* @version 0.23.1
60
* @license LGPL
61
*/
62
class Text_Papyrus extends Text_Wiki {
63
 
64
    /**
65
    *
66
    * Liste de règles par défaut du format Papyrs dans leur ordre d'application au texte
67
    * à transformer.
68
    *
69
    * @access public
70
    *
71
    * @var array
72
    *
73
    */
74
    var $rules = array(
75
        'Inclure'// Action Inclure
76
        // Le texte récupéré doit être du XHTML
77
    );
78
 
79
    /**
80
    *
81
    * The list of rules to not-apply to the source text.
82
    *
83
    * @access public
84
    *
85
    * @var array
86
    *
87
    */
88
    var $disable = array(
89
        'Include',
90
        'Embed'
91
    );
92
 
93
    /**
94
    *
95
    * The delimiter for token numbers of parsed elements in source text.
96
    *
97
    * @access public
98
    *
99
    * @var string
100
    *
101
    */
102
    var $delim = 12;
103
 
104
    function Text_Papyrus()
105
    {
106
        Text_Wiki::Text_Wiki();
107
 
108
        $this->addPath(
109
            'parse',
110
            $this->fixPath(dirname(__FILE__)) . 'Parse/'
111
        );
112
 
113
        $this->addPath(
114
            'render',
115
            $this->fixPath(dirname(__FILE__)) . 'Render/'
116
        );
117
    }
118
 
119
    /**
120
    *
121
    * Renders tokens back into the source text, based on the requested format.
122
    *
123
    * @access public
124
    *
125
    * @param string $format The target output format, typically 'xhtml'.
126
    * If a rule does not support a given format, the output from that
127
    * rule is rule-specific.
128
    *
129
    * @return string The transformed wiki text.
130
    *
131
    */
132
    function render($format = 'Xhtml')
133
    {
134
        // the rendering method we're going to use from each rule
135
        $format = ucwords(strtolower($format));
136
 
137
        // the eventual output text
138
        $output = '';
139
 
140
        // when passing through the parsed source text, keep track of when
141
        // we are in a delimited section
142
        $in_delim = false;
143
 
144
        // when in a delimited section, capture the token key number
145
        $key = '';
146
 
147
        // load the format object
148
        $this->loadFormatObj($format);
149
 
150
        // pre-rendering activity
151
        if (is_object($this->formatObj[$format])) {
152
            $output .= $this->formatObj[$format]->pre();
153
        }
154
 
155
        // load the render objects
156
        foreach (array_keys($this->parseObj) as $rule) {
157
            $this->loadRenderObj($format, $rule);
158
        }
159
 
160
        // pass through the parsed source text character by character
161
        $k = strlen($this->source);
162
        for ($i = 0; $i < $k; $i++) {
163
 
164
            // the current character
165
            $char = $this->source{$i};
166
 
167
            // are alredy in a delimited section?
168
            if ($in_delim) {
169
 
170
                // yes; are we ending the section?
171
                if ($char == chr($this->delim)) {
172
 
173
                    // yes, get the replacement text for the delimited
174
                    // token number and unset the flag.
175
                    $key = (int)$key;
176
                    $rule = $this->tokens[$key][0];
177
                    $opts = $this->tokens[$key][1];
178
                    $output .= $this->renderObj[$rule]->token($opts);
179
                    $in_delim = false;
180
 
181
                } else {
182
 
183
                    // no, add to the dlimited token key number
184
                    $key .= $char;
185
 
186
                }
187
 
188
            } else {
189
 
190
                // not currently in a delimited section.
191
                // are we starting into a delimited section?
192
                if ($char == chr($this->delim)) {
193
                    // yes, reset the previous key and
194
                    // set the flag.
195
                    $key = '';
196
                    $in_delim = true;
197
                } else {
198
                    // no, add to the output as-is
199
                    $output .= $char;
200
                }
201
            }
202
        }
203
 
204
        // post-rendering activity
205
        if (is_object($this->formatObj[$format])) {
206
            $output .= $this->formatObj[$format]->post();
207
        }
208
 
209
        // return the rendered source text.
210
        return $output;
211
    }
212
 
213
    /**
214
    *
215
    * Add a token to the Text_Wiki tokens array, and return a delimited
216
    * token number.
217
    *
218
    * @access public
219
    *
220
    * @param array $options An associative array of options for the new
221
    * token array element.  The keys and values are specific to the
222
    * rule, and may or may not be common to other rule options.  Typical
223
    * options keys are 'text' and 'type' but may include others.
224
    *
225
    * @param boolean $id_only If true, return only the token number, not
226
    * a delimited token string.
227
    *
228
    * @return string|int By default, return the number of the
229
    * newly-created token array element with a delimiter prefix and
230
    * suffix; however, if $id_only is set to true, return only the token
231
    * number (no delimiters).
232
    *
233
    */
234
    function addToken($rule, $options = array(), $id_only = false)
235
    {
236
        // increment the token ID number.  note that if you parse
237
        // multiple times with the same Text_Wiki object, the ID number
238
        // will not reset to zero.
239
        static $id;
240
        if (! isset($id)) {
241
            $id = 0;
242
        } else {
243
            $id ++;
244
        }
245
 
246
        // force the options to be an array
247
        settype($options, 'array');
248
 
249
        // add the token
250
        $this->tokens[$id] = array(
251
 
252
            1 => $options
253
        );
254
 
255
        // return a value
256
        if ($id_only) {
257
            // return the last token number
258
            return $id;
259
        } else {
260
            // return the token number with delimiters
261
            return chr($this->delim) . $id . chr($this->delim);
262
        }
263
    }
264
}
265
 
266
// +------------------------------------------------------------------------------------------------------+
267
// |                                            PIED du PROGRAMME                                         |
268
// +------------------------------------------------------------------------------------------------------+
269
 
270
 
271
 
272
/* +--Fin du code ----------------------------------------------------------------------------------------+
273
*
274
* $Log: not supported by cvs2svn $
275
* Revision 1.2  2004/11/25 15:36:41  jpm
276
* Suppression régle Delimiter car problème avec les délimitations de fin de ligne.
277
*
278
* Revision 1.1  2004/11/23 17:25:38  jpm
279
* Début classe PEAR WIKI pour la syntaxe Wikini.
280
*
281
*
282
* +-- Fin du code ----------------------------------------------------------------------------------------+
283
*/
284
?>