1
+ − 1
<?php
+ − 2
// vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4:
+ − 3
/**
+ − 4
* Baseline rule class for extension into a "real" parser component.
+ − 5
*
+ − 6
* PHP versions 4 and 5
+ − 7
*
+ − 8
* @category Text
+ − 9
* @package Text_Wiki
+ − 10
* @author Paul M. Jones <pmjones@php.net>
+ − 11
* @license http://www.gnu.org/copyleft/lesser.html LGPL License 2.1
+ − 12
* @version CVS: $Id: Parse.php,v 1.5 2005/07/29 08:57:29 toggg Exp $
+ − 13
* @link http://pear.php.net/package/Text_Wiki
+ − 14
*/
+ − 15
+ − 16
/**
+ − 17
* Baseline rule class for extension into a "real" parser component.
+ − 18
*
+ − 19
* Text_Wiki_Rule classes do not stand on their own; they are called by a
+ − 20
* Text_Wiki object, typcially in the transform() method. Each rule class
+ − 21
* performs three main activities: parse, process, and render.
+ − 22
*
+ − 23
* The parse() method takes a regex and applies it to the whole block of
+ − 24
* source text at one time. Each match is sent as $matches to the
+ − 25
* process() method.
+ − 26
*
+ − 27
* The process() method acts on the matched text from the source, and
+ − 28
* then processes the source text is some way. This may mean the
+ − 29
* creation of a delimited token using addToken(). In every case, the
+ − 30
* process() method returns the text that should replace the matched text
+ − 31
* from parse().
+ − 32
*
+ − 33
* @category Text
+ − 34
* @package Text_Wiki
+ − 35
* @author Paul M. Jones <pmjones@php.net>
+ − 36
* @license http://www.gnu.org/copyleft/lesser.html LGPL License 2.1
+ − 37
* @version Release: @package_version@
+ − 38
* @link http://pear.php.net/package/Text_Wiki
+ − 39
*/
+ − 40
class Text_Wiki_Parse {
+ − 41
+ − 42
+ − 43
/**
+ − 44
*
+ − 45
* Configuration options for this parser rule.
+ − 46
*
+ − 47
* @access public
+ − 48
*
+ − 49
* @var string
+ − 50
*
+ − 51
*/
+ − 52
+ − 53
var $conf = array();
+ − 54
+ − 55
+ − 56
/**
+ − 57
*
+ − 58
* Regular expression to find matching text for this rule.
+ − 59
*
+ − 60
* @access public
+ − 61
*
+ − 62
* @var string
+ − 63
*
+ − 64
* @see parse()
+ − 65
*
+ − 66
*/
+ − 67
+ − 68
var $regex = null;
+ − 69
+ − 70
+ − 71
/**
+ − 72
*
+ − 73
* The name of this rule for new token array elements.
+ − 74
*
+ − 75
* @access public
+ − 76
*
+ − 77
* @var string
+ − 78
*
+ − 79
*/
+ − 80
+ − 81
var $rule = null;
+ − 82
+ − 83
+ − 84
/**
+ − 85
*
+ − 86
* A reference to the calling Text_Wiki object.
+ − 87
*
+ − 88
* This is needed so that each rule has access to the same source
+ − 89
* text, token set, URLs, interwiki maps, page names, etc.
+ − 90
*
+ − 91
* @access public
+ − 92
*
+ − 93
* @var object
+ − 94
*/
+ − 95
+ − 96
var $wiki = null;
+ − 97
+ − 98
+ − 99
/**
+ − 100
*
+ − 101
* Constructor for this parser rule.
+ − 102
*
+ − 103
* @access public
+ − 104
*
+ − 105
* @param object &$obj The calling "parent" Text_Wiki object.
+ − 106
*
+ − 107
*/
+ − 108
+ − 109
function Text_Wiki_Parse(&$obj)
+ − 110
{
+ − 111
// set the reference to the calling Text_Wiki object;
+ − 112
// this allows us access to the shared source text, token
+ − 113
// array, etc.
+ − 114
$this->wiki =& $obj;
+ − 115
+ − 116
// set the name of this rule; generally used when adding
+ − 117
// to the tokens array. strip off the Text_Wiki_Parse_ portion.
+ − 118
// text_wiki_parse_
+ − 119
// 0123456789012345
+ − 120
$tmp = substr(get_class($this), 16);
+ − 121
$this->rule = ucwords(strtolower($tmp));
+ − 122
+ − 123
// override config options for the rule if specified
+ − 124
if (isset($this->wiki->parseConf[$this->rule]) &&
+ − 125
is_array($this->wiki->parseConf[$this->rule])) {
+ − 126
+ − 127
$this->conf = array_merge(
+ − 128
$this->conf,
+ − 129
$this->wiki->parseConf[$this->rule]
+ − 130
);
+ − 131
+ − 132
}
+ − 133
}
+ − 134
+ − 135
+ − 136
/**
+ − 137
*
+ − 138
* Abstrct method to parse source text for matches.
+ − 139
*
+ − 140
* Applies the rule's regular expression to the source text, passes
+ − 141
* every match to the process() method, and replaces the matched text
+ − 142
* with the results of the processing.
+ − 143
*
+ − 144
* @access public
+ − 145
*
+ − 146
* @see Text_Wiki_Parse::process()
+ − 147
*
+ − 148
*/
+ − 149
+ − 150
function parse()
+ − 151
{
+ − 152
$this->wiki->source = preg_replace_callback(
+ − 153
$this->regex,
+ − 154
array(&$this, 'process'),
+ − 155
$this->wiki->source
+ − 156
);
+ − 157
}
+ − 158
+ − 159
+ − 160
/**
+ − 161
*
+ − 162
* Abstract method to generate replacements for matched text.
+ − 163
*
+ − 164
* @access public
+ − 165
*
+ − 166
* @param array $matches An array of matches from the parse() method
+ − 167
* as generated by preg_replace_callback. $matches[0] is the full
+ − 168
* matched string, $matches[1] is the first matched pattern,
+ − 169
* $matches[2] is the second matched pattern, and so on.
+ − 170
*
+ − 171
* @return string The processed text replacement; defaults to the
+ − 172
* full matched string (i.e., no changes to the text).
+ − 173
*
+ − 174
* @see Text_Wiki_Parse::parse()
+ − 175
*
+ − 176
*/
+ − 177
+ − 178
function process(&$matches)
+ − 179
{
+ − 180
return $matches[0];
+ − 181
}
+ − 182
+ − 183
+ − 184
/**
+ − 185
*
+ − 186
* Simple method to safely get configuration key values.
+ − 187
*
+ − 188
* @access public
+ − 189
*
+ − 190
* @param string $key The configuration key.
+ − 191
*
+ − 192
* @param mixed $default If the key does not exist, return this value
+ − 193
* instead.
+ − 194
*
+ − 195
* @return mixed The configuration key value (if it exists) or the
+ − 196
* default value (if not).
+ − 197
*
+ − 198
*/
+ − 199
+ − 200
function getConf($key, $default = null)
+ − 201
{
+ − 202
if (isset($this->conf[$key])) {
+ − 203
return $this->conf[$key];
+ − 204
} else {
+ − 205
return $default;
+ − 206
}
+ − 207
}
+ − 208
+ − 209
+ − 210
/**
+ − 211
*
+ − 212
* Extract 'attribute="value"' portions of wiki markup.
+ − 213
*
+ − 214
* This kind of markup is typically used only in macros, but is useful
+ − 215
* anywhere.
+ − 216
*
+ − 217
* The syntax is pretty strict; there can be no spaces between the
+ − 218
* option name, the equals, and the first double-quote; the value
+ − 219
* must be surrounded by double-quotes. You can escape characters in
+ − 220
* the value with a backslash, and the backslash will be stripped for
+ − 221
* you.
+ − 222
*
+ − 223
* @access public
+ − 224
*
+ − 225
* @param string $text The "attributes" portion of markup.
+ − 226
*
+ − 227
* @return array An associative array of key-value pairs where the
+ − 228
* key is the option name and the value is the option value.
+ − 229
*
+ − 230
*/
+ − 231
+ − 232
function getAttrs($text)
+ − 233
{
+ − 234
// find the =" sections;
+ − 235
$tmp = explode('="', trim($text));
+ − 236
+ − 237
// basic setup
+ − 238
$k = count($tmp) - 1;
+ − 239
$attrs = array();
+ − 240
$key = null;
+ − 241
+ − 242
// loop through the sections
+ − 243
foreach ($tmp as $i => $val) {
+ − 244
+ − 245
// first element is always the first key
+ − 246
if ($i == 0) {
+ − 247
$key = trim($val);
+ − 248
continue;
+ − 249
}
+ − 250
+ − 251
// find the last double-quote in the value.
+ − 252
// the part to the left is the value for the last key,
+ − 253
// the part to the right is the next key name
+ − 254
$pos = strrpos($val, '"');
+ − 255
$attrs[$key] = stripslashes(substr($val, 0, $pos));
+ − 256
$key = trim(substr($val, $pos+1));
+ − 257
+ − 258
}
+ − 259
+ − 260
return $attrs;
+ − 261
+ − 262
}
+ − 263
}
+ − 264
?>