1
+ − 1
<?php
+ − 2
+ − 3
/**
+ − 4
*
+ − 5
* Parse for links to wiki pages.
+ − 6
*
+ − 7
* @category Text
+ − 8
*
+ − 9
* @package Text_Wiki
+ − 10
*
+ − 11
* @author Paul M. Jones <pmjones@php.net>
+ − 12
*
+ − 13
* @license LGPL
+ − 14
*
+ − 15
* @version $Id: Wikilink.php,v 1.5 2005/09/14 14:29:38 toggg Exp $
+ − 16
*
+ − 17
*/
+ − 18
+ − 19
/**
+ − 20
*
+ − 21
* Parse for links to wiki pages.
+ − 22
*
+ − 23
* Wiki page names are typically in StudlyCapsStyle made of
+ − 24
* WordsSmashedTogether.
+ − 25
*
+ − 26
* You can also create described links to pages in this style:
+ − 27
* [WikiPageName nice text link to use for display]
+ − 28
*
+ − 29
* The token options for this rule are:
+ − 30
*
+ − 31
* 'page' => the wiki page name.
+ − 32
*
+ − 33
* 'text' => the displayed link text.
+ − 34
*
+ − 35
* 'anchor' => a named anchor on the target wiki page.
+ − 36
*
+ − 37
* @category Text
+ − 38
*
+ − 39
* @package Text_Wiki
+ − 40
*
+ − 41
* @author Paul M. Jones <pmjones@php.net>
+ − 42
*
+ − 43
*/
+ − 44
+ − 45
class Text_Wiki_Parse_Wikilink extends Text_Wiki_Parse {
+ − 46
+ − 47
var $conf = array (
+ − 48
'ext_chars' => false
+ − 49
);
+ − 50
+ − 51
/**
+ − 52
*
+ − 53
* Constructor.
+ − 54
*
+ − 55
* We override the Text_Wiki_Parse constructor so we can
+ − 56
* explicitly comment each part of the $regex property.
+ − 57
*
+ − 58
* @access public
+ − 59
*
+ − 60
* @param object &$obj The calling "parent" Text_Wiki object.
+ − 61
*
+ − 62
*/
+ − 63
+ − 64
function Text_Wiki_Parse_Wikilink(&$obj)
+ − 65
{
+ − 66
parent::Text_Wiki_Parse($obj);
+ − 67
+ − 68
if ($this->getConf('ext_chars')) {
+ − 69
// use an extended character set; this should
+ − 70
// allow for umlauts and so on. taken from the
+ − 71
// Tavi project defaults.php file.
+ − 72
$upper = "A-Z\xc0-\xde";
+ − 73
$lower = "a-z0-9\xdf-\xfe";
+ − 74
$either = "A-Za-z0-9\xc0-\xfe";
+ − 75
} else {
+ − 76
// the default character set, should be fine
+ − 77
// for most purposes.
+ − 78
$upper = "A-Z";
+ − 79
$lower = "a-z0-9";
+ − 80
$either = "A-Za-z0-9";
+ − 81
}
+ − 82
+ − 83
// build the regular expression for finding WikiPage names.
+ − 84
$this->regex =
+ − 85
"(!?" . // START WikiPage pattern (1)
+ − 86
"[$upper]" . // 1 upper
+ − 87
"[$either]*" . // 0+ alpha or digit
+ − 88
"[$lower]+" . // 1+ lower or digit
+ − 89
"[$upper]" . // 1 upper
+ − 90
"[$either]*" . // 0+ or more alpha or digit
+ − 91
")" . // END WikiPage pattern (/1)
+ − 92
"((\#" . // START Anchor pattern (2)(3)
+ − 93
"[$either]" . // 1 alpha
+ − 94
"(" . // start sub pattern (4)
+ − 95
"[-_$either:.]*" . // 0+ dash, alpha, digit, underscore, colon, dot
+ − 96
"[-_$either]" . // 1 dash, alpha, digit, or underscore
+ − 97
")?)?)"; // end subpatterns (/4)(/3)(/2)
+ − 98
}
+ − 99
+ − 100
+ − 101
/**
+ − 102
*
+ − 103
* First parses for described links, then for standalone links.
+ − 104
*
+ − 105
* @access public
+ − 106
*
+ − 107
* @return void
+ − 108
*
+ − 109
*/
+ − 110
+ − 111
function parse()
+ − 112
{
+ − 113
// described wiki links
+ − 114
$tmp_regex = '/\[' . $this->regex . ' (.+?)\]/';
+ − 115
$this->wiki->source = preg_replace_callback(
+ − 116
$tmp_regex,
+ − 117
array(&$this, 'processDescr'),
+ − 118
$this->wiki->source
+ − 119
);
+ − 120
+ − 121
// standalone wiki links
+ − 122
if ($this->getConf('ext_chars')) {
+ − 123
$either = "A-Za-z0-9\xc0-\xfe";
+ − 124
} else {
+ − 125
$either = "A-Za-z0-9";
+ − 126
}
+ − 127
+ − 128
$tmp_regex = "/(^|[^{$either}\-_]){$this->regex}/";
+ − 129
$this->wiki->source = preg_replace_callback(
+ − 130
$tmp_regex,
+ − 131
array(&$this, 'process'),
+ − 132
$this->wiki->source
+ − 133
);
+ − 134
}
+ − 135
+ − 136
+ − 137
/**
+ − 138
*
+ − 139
* Generate a replacement for described links.
+ − 140
*
+ − 141
* @access public
+ − 142
*
+ − 143
* @param array &$matches The array of matches from parse().
+ − 144
*
+ − 145
* @return A delimited token to be used as a placeholder in
+ − 146
* the source text, plus any text priot to the match.
+ − 147
*
+ − 148
*/
+ − 149
+ − 150
function processDescr(&$matches)
+ − 151
{
+ − 152
// set the options
+ − 153
$options = array(
+ − 154
'page' => $matches[1],
+ − 155
'text' => $matches[5],
+ − 156
'anchor' => $matches[3]
+ − 157
);
+ − 158
+ − 159
// create and return the replacement token and preceding text
+ − 160
return $this->wiki->addToken($this->rule, $options); // . $matches[7];
+ − 161
}
+ − 162
+ − 163
+ − 164
/**
+ − 165
*
+ − 166
* Generate a replacement for standalone links.
+ − 167
*
+ − 168
*
+ − 169
* @access public
+ − 170
*
+ − 171
* @param array &$matches The array of matches from parse().
+ − 172
*
+ − 173
* @return A delimited token to be used as a placeholder in
+ − 174
* the source text, plus any text prior to the match.
+ − 175
*
+ − 176
*/
+ − 177
+ − 178
function process(&$matches)
+ − 179
{
+ − 180
// when prefixed with !, it's explicitly not a wiki link.
+ − 181
// return everything as it was.
+ − 182
if ($matches[2]{0} == '!') {
+ − 183
return $matches[1] . substr($matches[2], 1) . $matches[3];
+ − 184
}
+ − 185
+ − 186
// set the options
+ − 187
$options = array(
+ − 188
'page' => $matches[2],
+ − 189
'text' => $matches[2] . $matches[3],
+ − 190
'anchor' => $matches[3]
+ − 191
);
+ − 192
+ − 193
// create and return the replacement token and preceding text
+ − 194
return $matches[1] . $this->wiki->addToken($this->rule, $options);
+ − 195
}
+ − 196
}
+ − 197
?>