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