|
1 <?php |
|
2 |
|
3 /** |
|
4 * |
|
5 * Parses for wiki freelink text. |
|
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: Freelink.php,v 1.4 2005/10/19 23:43:53 toggg Exp $ |
|
16 * |
|
17 */ |
|
18 |
|
19 /** |
|
20 * |
|
21 * Parses for freelinked page links. |
|
22 * |
|
23 * This class implements a Text_Wiki_Parse to find source text marked as a |
|
24 * wiki freelink, and automatically create a link to that page. |
|
25 * |
|
26 * A freelink is any page name not conforming to the standard |
|
27 * StudlyCapsStyle for a wiki page name. For example, a page normally |
|
28 * named MyHomePage can be renamed and referred to as ((My Home Page)) -- |
|
29 * note the spaces in the page name. You can also make a "nice-looking" |
|
30 * link without renaming the target page; e.g., ((MyHomePage|My Home |
|
31 * Page)). Finally, you can use named anchors on the target page: |
|
32 * ((MyHomePage|My Home Page#Section1)). |
|
33 * |
|
34 * @category Text |
|
35 * |
|
36 * @package Text_Wiki |
|
37 * |
|
38 * @author Paul M. Jones <pmjones@php.net> |
|
39 * |
|
40 */ |
|
41 |
|
42 class Text_Wiki_Parse_Freelink extends Text_Wiki_Parse { |
|
43 |
|
44 |
|
45 /** |
|
46 * |
|
47 * Constructor. We override the Text_Wiki_Parse constructor so we can |
|
48 * explicitly comment each part of the $regex property. |
|
49 * |
|
50 * @access public |
|
51 * |
|
52 * @param object &$obj The calling "parent" Text_Wiki object. |
|
53 * |
|
54 */ |
|
55 |
|
56 function Text_Wiki_Parse_Freelink(&$obj) |
|
57 { |
|
58 parent::Text_Wiki_Parse($obj); |
|
59 |
|
60 $this->regex = |
|
61 '/' . // START regex |
|
62 "\\(\\(" . // double open-parens |
|
63 "(" . // START freelink page patter |
|
64 "[-A-Za-z0-9 _+\\/.,;:!?'\"\\[\\]\\{\\}&\xc0-\xff]+" . // 1 or more of just about any character |
|
65 ")" . // END freelink page pattern |
|
66 "(" . // START display-name |
|
67 "\|" . // a pipe to start the display name |
|
68 "[-A-Za-z0-9 _+\\/.,;:!?'\"\\[\\]\\{\\}&\xc0-\xff]+" . // 1 or more of just about any character |
|
69 ")?" . // END display-name pattern 0 or 1 |
|
70 "(" . // START pattern for named anchors |
|
71 "\#" . // a hash mark |
|
72 "[A-Za-z]" . // 1 alpha |
|
73 "[-A-Za-z0-9_:.]*" . // 0 or more alpha, digit, underscore |
|
74 ")?" . // END named anchors pattern 0 or 1 |
|
75 "()\\)\\)" . // double close-parens |
|
76 '/'; // END regex |
|
77 } |
|
78 |
|
79 |
|
80 /** |
|
81 * |
|
82 * Generates a replacement for the matched text. Token options are: |
|
83 * |
|
84 * 'page' => the wiki page name (e.g., HomePage). |
|
85 * |
|
86 * 'text' => alternative text to be displayed in place of the wiki |
|
87 * page name. |
|
88 * |
|
89 * 'anchor' => a named anchor on the target wiki page |
|
90 * |
|
91 * @access public |
|
92 * |
|
93 * @param array &$matches The array of matches from parse(). |
|
94 * |
|
95 * @return A delimited token to be used as a placeholder in |
|
96 * the source text, plus any text priot to the match. |
|
97 * |
|
98 */ |
|
99 |
|
100 function process(&$matches) |
|
101 { |
|
102 // use nice variable names |
|
103 $page = $matches[1]; |
|
104 $text = $matches[2]; |
|
105 $anchor = $matches[3]; |
|
106 |
|
107 // is the page given a new text appearance? |
|
108 if (trim($text) == '') { |
|
109 // no |
|
110 $text = $page; |
|
111 } else { |
|
112 // yes, strip the leading | character |
|
113 $text = substr($text, 1); |
|
114 } |
|
115 |
|
116 // set the options |
|
117 $options = array( |
|
118 'page' => $page, |
|
119 'text' => $text, |
|
120 'anchor' => $anchor |
|
121 ); |
|
122 |
|
123 // return a token placeholder |
|
124 return $this->wiki->addToken($this->rule, $options); |
|
125 } |
|
126 } |
|
127 ?> |