|
1 <?php |
|
2 // vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: |
|
3 /** |
|
4 * Default: Parses for smileys / emoticons tags |
|
5 * |
|
6 * This class implements a Text_Wiki_Rule to find source text marked as |
|
7 * smileys defined by symbols as ':)' , ':-)' or ':smile:' |
|
8 * The symbol is replaced with a token. |
|
9 * |
|
10 * PHP versions 4 and 5 |
|
11 * |
|
12 * @category Text |
|
13 * @package Text_Wiki |
|
14 * @author Bertrand Gugger <bertrand@toggg.com> |
|
15 * @copyright 2005 bertrand Gugger |
|
16 * @license http://www.gnu.org/copyleft/lesser.html LGPL License 2.1 |
|
17 * @version CVS: $Id: Smiley.php,v 1.6 2005/10/04 08:17:51 toggg Exp $ |
|
18 * @link http://pear.php.net/package/Text_Wiki |
|
19 */ |
|
20 |
|
21 /** |
|
22 * Smiley rule parser class for Default. |
|
23 * |
|
24 * @category Text |
|
25 * @package Text_Wiki |
|
26 * @author Bertrand Gugger <bertrand@toggg.com> |
|
27 * @copyright 2005 bertrand Gugger |
|
28 * @license http://www.gnu.org/copyleft/lesser.html LGPL License 2.1 |
|
29 * @version Release: @package_version@ |
|
30 * @link http://pear.php.net/package/Text_Wiki |
|
31 * @see Text_Wiki_Parse::Text_Wiki_Parse() |
|
32 */ |
|
33 class Text_Wiki_Parse_Smiley extends Text_Wiki_Parse { |
|
34 |
|
35 /** |
|
36 * Configuration keys for this rule |
|
37 * 'smileys' => array Smileys recognized by this rule, symbols key definitions: |
|
38 * 'symbol' => array ( 'name', 'description' [, 'variante', ...] ) as |
|
39 * ':)' => array('smile', 'Smile'), |
|
40 * ':D' => array('biggrin', 'Very Happy',':grin:'), |
|
41 * the eventual elements after symbol and description are variantes |
|
42 * |
|
43 * 'auto_nose' => boolean enabling the auto nose feature: |
|
44 * auto build a variante for 2 chars symbols by inserting a '-' as ':)' <=> ':-)' |
|
45 * |
|
46 * @access public |
|
47 * @var array 'config-key' => mixed config-value |
|
48 */ |
|
49 var $conf = array( |
|
50 'smileys' => array( |
|
51 ':D' => array('biggrin', 'Very Happy', ':grin:'), |
|
52 ':)' => array('smile', 'Smile', '(:'), |
|
53 ':(' => array('sad', 'Sad', '):'), |
|
54 ':o' => array('surprised', 'Surprised', ':eek:', 'o:'), |
|
55 ':shock:' => array('eek', 'Shocked'), |
|
56 ':?' => array('confused', 'Confused', ':???:'), |
|
57 '8)' => array('cool', 'Cool', '(8'), |
|
58 ':lol:' => array('lol', 'Laughing'), |
|
59 ':x' => array('mad', 'Mad'), |
|
60 ':P' => array('razz', 'Razz'), |
|
61 ':oops:' => array('redface', 'Embarassed'), |
|
62 ':cry:' => array('cry', 'Crying or Very sad'), |
|
63 ':evil:' => array('evil', 'Evil or Very Mad'), |
|
64 ':twisted:' => array('twisted', 'Twisted Evil'), |
|
65 ':roll:' => array('rolleyes', 'Rolling Eyes'), |
|
66 ';)' => array('wink', 'Wink', '(;'), |
|
67 ':!:' => array('exclaim', 'Exclamation'), |
|
68 ':?:' => array('question', 'Question'), |
|
69 ':idea:' => array('idea', 'Idea'), |
|
70 ':arrow:' => array('arrow', 'Arrow'), |
|
71 ':|' => array('neutral', 'Neutral', '|:'), |
|
72 ':mrgreen:' => array('mrgreen', 'Mr. Green'), |
|
73 ), |
|
74 'auto_nose' => true |
|
75 ); |
|
76 |
|
77 /** |
|
78 * Definition array of smileys, variantes references their model |
|
79 * 'symbol' => array ( 'name', 'description') |
|
80 * |
|
81 * @access private |
|
82 * @var array 'config-key' => mixed config-value |
|
83 */ |
|
84 var $_smileys = array(); |
|
85 |
|
86 /** |
|
87 * Constructor. |
|
88 * We override the constructor to build up the regex from config |
|
89 * |
|
90 * @param object &$obj the base conversion handler |
|
91 * @return The parser object |
|
92 * @access public |
|
93 */ |
|
94 function Text_Wiki_Parse_Smiley(&$obj) |
|
95 { |
|
96 $default = $this->conf; |
|
97 parent::Text_Wiki_Parse($obj); |
|
98 |
|
99 // read the list of smileys to sort out variantes and :xxx: while building the regexp |
|
100 $this->_smileys = $this->getConf('smileys', $default['smileys']); |
|
101 $autoNose = $this->getConf('auto_nose', $default['auto_nose']); |
|
102 $reg1 = $reg2 = ''; |
|
103 $sep1 = ':(?:'; |
|
104 $sep2 = ''; |
|
105 foreach ($this->_smileys as $smiley => $def) { |
|
106 for ($i = 1; $i < count($def); $i++) { |
|
107 if ($i > 1) { |
|
108 $cur = $def[$i]; |
|
109 $this->_smileys[$cur] = &$this->_smileys[$smiley]; |
|
110 } else { |
|
111 $cur = $smiley; |
|
112 } |
|
113 $len = strlen($cur); |
|
114 if (($cur{0} == ':') && ($len > 2) && ($cur{$len - 1} == ':')) { |
|
115 $reg1 .= $sep1 . preg_quote(substr($cur, 1, -1), '#'); |
|
116 $sep1 = '|'; |
|
117 continue; |
|
118 } |
|
119 if ($autoNose && ($len === 2)) { |
|
120 $variante = $cur{0} . '-' . $cur{1}; |
|
121 $this->_smileys[$variante] = &$this->_smileys[$smiley]; |
|
122 $cur = preg_quote($cur{0}, '#') . '-?' . preg_quote($cur{1}, '#'); |
|
123 } else { |
|
124 $cur = preg_quote($cur, '#'); |
|
125 } |
|
126 $reg2 .= $sep2 . $cur; |
|
127 $sep2 = '|'; |
|
128 } |
|
129 } |
|
130 $delim = '[\n\r\s' . $this->wiki->delim . '$^]'; |
|
131 $this->regex = '#(?<=' . $delim . |
|
132 ')(' . ($reg1 ? $reg1 . '):' . ($reg2 ? '|' : '') : '') . $reg2 . |
|
133 ')(?=' . $delim . ')#i'; |
|
134 } |
|
135 |
|
136 /** |
|
137 * Generates a replacement token for the matched text. Token options are: |
|
138 * 'symbol' => the original marker |
|
139 * 'name' => the name of the smiley |
|
140 * 'desc' => the description of the smiley |
|
141 * |
|
142 * @param array &$matches The array of matches from parse(). |
|
143 * @return string Delimited token representing the smiley |
|
144 * @access public |
|
145 */ |
|
146 function process(&$matches) |
|
147 { |
|
148 // tokenize |
|
149 return $this->wiki->addToken($this->rule, |
|
150 array( |
|
151 'symbol' => $matches[1], |
|
152 'name' => $this->_smileys[$matches[1]][0], |
|
153 'desc' => $this->_smileys[$matches[1]][1] |
|
154 )); |
|
155 } |
|
156 } |
|
157 ?> |