1<?php
2
3/**
4*
5* Parses for text marked as revised (insert/delete).
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$
16*
17*/
18
19/**
20*
21* Parses for text marked as revised (insert/delete).
22*
23* @category Text
24*
25* @package Text_Wiki
26*
27* @author Paul M. Jones <pmjones@php.net>
28*
29*/
30
31class Text_Wiki_Parse_Revise extends Text_Wiki_Parse {
32
33
34    /**
35    *
36    * The regular expression used to parse the source text and find
37    * matches conforming to this rule.  Used by the parse() method.
38    *
39    * @access public
40    *
41    * @var string
42    *
43    * @see parse()
44    *
45    */
46
47    var $regex = "/\@\@({*?.*}*?)\@\@/U";
48
49
50    /**
51    *
52    * Config options.
53    *
54    * @access public
55    *
56    * @var array
57    *
58    */
59
60    var $conf = array(
61        'delmark' => '---',
62        'insmark' => '+++'
63    );
64
65
66    /**
67    *
68    * Generates a replacement for the matched text.  Token options are:
69    *
70    * 'type' => ['start'|'end'] The starting or ending point of the
71    * inserted text.  The text itself is left in the source.
72    *
73    * @access public
74    *
75    * @param array &$matches The array of matches from parse().
76    *
77    * @return string A pair of delimited tokens to be used as a
78    * placeholder in the source text surrounding the teletype text.
79    *
80    */
81
82    function process(&$matches)
83    {
84        $output = '';
85        $src = $matches[1];
86        $delmark = $this->getConf('delmark'); // ---
87        $insmark = $this->getConf('insmark'); // +++
88
89        // '---' must be before '+++' (if they both appear)
90        $del = strpos($src, $delmark);
91        $ins = strpos($src, $insmark);
92
93        // if neither is found, return right away
94        if ($del === false && $ins === false) {
95            return $matches[0];
96        }
97
98        // handle text to be deleted
99        if ($del !== false) {
100
101            // move forward to the end of the deletion mark
102            $del += strlen($delmark);
103
104            if ($ins === false) {
105                // there is no insertion text following
106                $text = substr($src, $del);
107            } else {
108                // there is insertion text following,
109                // mitigate the length
110                $text = substr($src, $del, $ins - $del);
111            }
112
113            $output .= $this->wiki->addToken(
114                $this->rule, array('type' => 'del_start')
115            );
116
117            $output .= $text;
118
119            $output .= $this->wiki->addToken(
120                $this->rule, array('type' => 'del_end')
121            );
122        }
123
124        // handle text to be inserted
125        if ($ins !== false) {
126
127            // move forward to the end of the insert mark
128            $ins += strlen($insmark);
129            $text = substr($src, $ins);
130
131            $output .= $this->wiki->addToken(
132                $this->rule, array('type' => 'ins_start')
133            );
134
135            $output .= $text;
136
137            $output .= $this->wiki->addToken(
138                $this->rule, array('type' => 'ins_end')
139            );
140        }
141
142        return $output;
143    }
144}
145?>