]>
Commit | Line | Data |
---|---|---|
baa408b8 ER |
1 | Index: package2.xml |
2 | =================================================================== | |
3 | Cannot display: file marked as a binary type. | |
4 | svn:mime-type = application/xml | |
5 | Index: config.w32 | |
6 | =================================================================== | |
7 | --- config.w32 (.../tags/RELEASE_1_0_2) | |
8 | +++ config.w32 (.../trunk) | |
9 | @@ -0,0 +1,10 @@ | |
10 | +// $Id$ | |
11 | +// vim:ft=javascript | |
12 | + | |
13 | +ARG_ENABLE("bbcode", "BBcode", "no"); | |
14 | + | |
15 | +if (PHP_BBCODE != "no") { | |
16 | + EXTENSION("bbcode", "php_bbcode.c"); | |
17 | + ADD_SOURCES(configure_module_dirname + "/lib", "bbcode2.c bstrlib.c", "bbcode"); | |
18 | + AC_DEFINE('HAVE_BBCODE', 1, 'Have BBCODE library'); | |
19 | +} | |
20 | ||
21 | Property changes on: config.w32 | |
22 | ___________________________________________________________________ | |
23 | Added: svn:eol-style | |
24 | + native | |
25 | Added: svn:keywords | |
26 | + Id Rev Revision Date LastChangedDate LastChangedRevision Author LastChangedBy HeadURL URL | |
27 | Added: cvs2svn:cvs-rev | |
28 | + 1.2 | |
29 | ||
30 | Index: tests/test_ivy.phpt | |
31 | =================================================================== | |
32 | --- tests/test_ivy.phpt (.../tags/RELEASE_1_0_2) | |
33 | +++ tests/test_ivy.phpt (.../trunk) | |
34 | @@ -0,0 +1,506 @@ | |
35 | +--TEST-- | |
36 | +BBCODE No parse Test | |
37 | +--FILE-- | |
38 | +<?php | |
39 | +if (!extension_loaded("bbcode")){ | |
40 | + if (!dl('bbcode.so')){ | |
41 | + die ('bbcode not loadable'); | |
42 | + } | |
43 | +} | |
44 | +define("____page",""); | |
45 | +$text=<<<EOF | |
46 | +[just][center][round][color=red][size=18]Nous Recherchons un(e) ministre d'urgence Contactez [id=7760]moi[/id][/size][/color][/round][/center][/just]<br /> | |
47 | +<br /> | |
48 | +<br /> | |
49 | +<br /> | |
50 | +<br /> | |
51 | +[just][center][quote=[color=green]Pod Pocket[/color]]<br /> | |
52 | +[color=teal]Avec l'arrivé de l'été, arrive le nouveau line 6 Pod Pocket, quelle coinsidence !!!<br /> | |
53 | +Il s'agit donc d'un mini simulateur d'ampli de la célèbre ligné Pod qui est le fer de lance de la marque depuis son lancement en 1998.<br /> | |
54 | +<br /> | |
55 | +Line 6 étant les rois de la simulation d'ampli, la firme s'oriente donc avec ce produit vers le marché de la musique mobile. Cette nouveauté ne sort pas avant les vacances d'été pour rien, il s'avère être très design, facile à transporter et donc l'outil idéal pour les vacances.<br /> | |
56 | +<br /> | |
57 | +De la taille d'un simple accordeur, le Pod pocket est tout de même ultra complet. En effet, il possède à son menu 32 modélisations d'amplis, 16 baffles et pas moins de 16 effets intégrés. Vous ne rêvez pas, vous vous dites il est si petit mais offre-t-il les mêmes capacités que le Pod II ? et bien oui !<br /> | |
58 | +Et tenez vous bien, il marche à piles (pour se la jouer rebelz sur la plage... :p) ou sur secteur (pour vous perfectionner avant de vous la jouer sur la plage...:p). Donc que vous soyez frimeur à montrer vos 4 accords aux potes en exterieur espérant attirer les demoiselles, ou que vous soyez enfermé dans votre cagibi depuis 2 mois jonglant entre la carte son du pc et votre guitare, il vous est déstiné et vous simplifira certainement les choses.[/color][/quote][/center][/just]<br /> | |
59 | +<br /> | |
60 | +[just][center][size=16][color=red][b][u][just][center][round][color=lightblue][b][u]Voici les données constructeur :[/just][/center][/size][/color][/b][/u][/just][/center][/round][/color][/b][/u]<br /> | |
61 | +<br /> | |
62 | +[just][center][round][color=lightblue][b][u]Caractéristiques :[/u][/b][/color]<br /> | |
63 | +[list]<br /> | |
64 | +[*]300 presets modifiables<br /> | |
65 | +[*]32 modélisations d'amplis<br /> | |
66 | +[*]16 modélisations d'enceintes<br /> | |
67 | +[*]16 effets<br /> | |
68 | +[*]alimentation par un pile AAA<br /> | |
69 | +[*]Entrées jack 6.35 et 3.5<br /> | |
70 | +[*]Connexion USB<br /> | |
71 | +[*]technologie A.I.R. II permettant un enregistrement direct<br /> | |
72 | +[*]connexion au site customtone.com pour télécharger jusqu'à 3000 sons<br /> | |
73 | +[*]logiciel d'édition PC[/round][/center][/just]<br /> | |
74 | +[/list]<br /> | |
75 | +<br /> | |
76 | +[just][center][round][color=lightgreen][b][u]Modèles d’amplis basés sur:[/u][/b][/color]<br /> | |
77 | +[list]<br /> | |
78 | +[*]’64 Fender® Deluxe Reverb®<br /> | |
79 | +[*]’59 Fender® Bassman®<br /> | |
80 | +[*]’68 Marshall® Plexi 100 watt <br /> | |
81 | +[*]Rencontre d’un Marshall® JTM-45 et d’un Budda Twinmaster <br /> | |
82 | +[*]’60 Tweed Fender® Champ® <br /> | |
83 | +[*]Tête Budda Twinmaster<br /> | |
84 | +[*]’65 Blackface Fender® Twin Reverb® <br /> | |
85 | +[*]’60 Vox® AC 15 <br /> | |
86 | +[*]’60 Vox® AC 30 non-Top Boost <br /> | |
87 | +[*]’85 Mesa/Boogie® Mark IIc+ canal Clean<br /> | |
88 | +[*]’85 Mesa/Boogie® Mark IIc+ canal Drive Canal Clean du Dumble® Overdrive Special<br /> | |
89 | +[*]’95 Tête Mesa/Boogie® Dual Rectifier®<br /> | |
90 | +[*]’89 Soldano SLO Super Lead Overdrive Canal Drive du Dumble® Overdrive Special <br /> | |
91 | +[*]1987 Roland® JC-120 Jazz Chorus Line 6® Insane[/round][/center][/just]<br /> | |
92 | +[/list]<br /> | |
93 | +[just][center][round][color=lightyellow][b][u]Modèles d’enceintes basés sur:[/u][b][/color]<br /> | |
94 | +[list]<br /> | |
95 | +[*]1960 Fender® Tweed Champ®<br /> | |
96 | +[*]1952 Fender® Tweed Deluxe Reverb® <br /> | |
97 | +[*]1960 Vox® AC-15 <br /> | |
98 | +[*]1964 Fender® Deluxe Reverb® <br /> | |
99 | +[*]1965 Fender® Blackface Twin Reverb®<br /> | |
100 | +[*]1967 Vox® AC-30 <br /> | |
101 | +[*]1995 Matchless Chieftain <br /> | |
102 | +[*]1959 Fender® Bassman® <br /> | |
103 | +[*]1996 Marshall® avec haut-parleurs 30 vintage <br /> | |
104 | +[*]1978 Marshall® avec haut-parleurs 70 d’origine <br /> | |
105 | +[*]1968 Marshall® Basketweave avec Greenbacks Line 6® 4x12 Line 6® 1x12 Line 6® 2x12 Line 6® 4x10 [/round][/center][/just][/list]<br /> | |
106 | +<br /> | |
107 | +<br /> | |
108 | +[just][center][round][color=pink][b][u]16 effets :[/u][/b][/color]<br /> | |
109 | +Compresseur ; Délai/Compresseur <br /> | |
110 | +Trémolo ; Délai/Trémolo <br /> | |
111 | +Chorus 1 ; Délai/Chorus <br /> | |
112 | +Chorus 2 ; Délai/Chorus <br /> | |
113 | +Flanger 1 ; Délai/Flanger1 <br /> | |
114 | +Flanger 2 ; Délai/Flanger<br /> | |
115 | +Haut-parleur rotatif<br /> | |
116 | +Délai/Délai ; Délai Réverbération.[/round][/center][/just] <br /> | |
117 | +<br /> | |
118 | +[just][center][round][color=red][b][u]Prix :[/u][/b][/color] <br /> | |
119 | +[list]<br /> | |
120 | +[*][color=red]99,00€[/color] sur www.woodbrass.com<br /> | |
121 | +[*][color=grey]119,00€[/color] prix public conseillé.[/list]<br /> | |
122 | +<br /> | |
123 | +[color=lime][b][u]Liens :[/u][/b][/color]<br /> | |
124 | +<br /> | |
125 | +infos tirées des sites suivants :<br /> | |
126 | +<br /> | |
127 | +[url=http://www.guitariste.com/articles/pocket-pod,890,1.html]www.guitariste.com[/url]<br /> | |
128 | +[url=http://fr.line6.com/pocketpod/index.html]www.line6.com[/url]<br /> | |
129 | +[/round][/center][/just] <br /> | |
130 | +<br /> | |
131 | +[just][center][size=16][color=blue][u][border]Questions :[/border][/u][/color][/size]<br /> | |
132 | +[list][color="blue]<br /> | |
133 | +[*] Pour vous ce type d'appareil est-il indispensable ?<br /> | |
134 | +[*] Selon vous c'est une innovation ou une remasterisation ?<br /> | |
135 | +[*] Le trouvez vous pratique de par sa taille et ses capacités ?[/color]<br /> | |
136 | +[/center][/just][/list] | |
137 | +EOF; | |
138 | +$arrayBBCode=array( | |
139 | + 'h1'=> array('type'=>BBCODE_TYPE_NOARG, 'flags'=>BBCODE_FLAGS_REMOVE_IF_EMPTY, 'open_tag'=>'<h1>', 'close_tag'=>'</h1>'), | |
140 | + 'h2'=> array('type'=>BBCODE_TYPE_NOARG, 'flags'=>BBCODE_FLAGS_REMOVE_IF_EMPTY, 'open_tag'=>'<h2>', 'close_tag'=>'</h2>'), | |
141 | + 'h3'=> array('type'=>BBCODE_TYPE_NOARG, 'flags'=>BBCODE_FLAGS_REMOVE_IF_EMPTY, 'open_tag'=>'<h3>', 'close_tag'=>'</h3>'), | |
142 | + 'b'=> array('type'=>BBCODE_TYPE_NOARG, 'flags'=>BBCODE_FLAGS_REMOVE_IF_EMPTY, 'open_tag'=>'<b>', 'close_tag'=>'</b>'), | |
143 | + 'u'=> array('type'=>BBCODE_TYPE_NOARG, 'flags'=>BBCODE_FLAGS_REMOVE_IF_EMPTY, 'open_tag'=>'<u>', 'close_tag'=>'</u>'), | |
144 | + 'i'=> array('type'=>BBCODE_TYPE_NOARG, 'flags'=>BBCODE_FLAGS_REMOVE_IF_EMPTY, 'open_tag'=>'<i>', 'close_tag'=>'</i>'), | |
145 | + 'm'=> array('type'=>BBCODE_TYPE_NOARG, 'flags'=>BBCODE_FLAGS_REMOVE_IF_EMPTY, 'open_tag'=>'<a href="/maraboutage.php">', 'close_tag'=>'</a>'), | |
146 | + 'cap'=> array('type'=>BBCODE_TYPE_NOARG, 'flags'=>BBCODE_FLAGS_REMOVE_IF_EMPTY, 'open_tag'=>'<span style="text-transform:capitalize;">', 'close_tag'=>'</span>'), | |
147 | + 'mini'=> array('type'=>BBCODE_TYPE_NOARG, 'flags'=>BBCODE_FLAGS_REMOVE_IF_EMPTY, 'open_tag'=>'<span class="mini">', 'close_tag'=>'</span>'), | |
148 | + 'right'=> array('type'=>BBCODE_TYPE_NOARG, 'flags'=>BBCODE_FLAGS_REMOVE_IF_EMPTY, 'open_tag'=>'<div style="text-align:right;">', 'close_tag'=>'</div>'.(basename(____page,".php")=="chat-2"?' ':'').''), | |
149 | + 'center'=> array('type'=>BBCODE_TYPE_NOARG, 'flags'=>BBCODE_FLAGS_REMOVE_IF_EMPTY, 'open_tag'=>'<div style="text-align:center;">', 'close_tag'=>'</div>'.(basename(____page,".php")=="chat-2"?' ':'').''), | |
150 | + 'just'=> array('type'=>BBCODE_TYPE_NOARG, 'flags'=>BBCODE_FLAGS_REMOVE_IF_EMPTY, 'open_tag'=>'<div style="text-align:justify;width:450px;margin:0 auto;">', 'close_tag'=>'</div>'.(basename(____page,".php")=="chat-2"?' ':'').''), | |
151 | + 'strike'=> array('type'=>BBCODE_TYPE_NOARG, 'flags'=>BBCODE_FLAGS_REMOVE_IF_EMPTY, 'open_tag'=>'<span style="text-decoration:line-through;">', 'close_tag'=>'</span>'), | |
152 | + 'ancre'=> array('type'=>BBCODE_TYPE_NOARG, 'childs'=>'', 'open_tag'=>'<a name="', 'close_tag'=>'"> </a>'), | |
153 | + 'moumou'=> array('type'=>BBCODE_TYPE_NOARG, 'childs'=>'', 'open_tag'=>'<img src="', 'close_tag'=>'" />'), | |
154 | + 'round'=> array('type'=>BBCODE_TYPE_NOARG, 'flags'=>BBCODE_FLAGS_REMOVE_IF_EMPTY, 'open_tag'=>'<div style="border:2px double white;border-radius: 8px; padding:6px; -moz-border-radius: 8px; background-color:#000; color:#FFF;">', 'close_tag'=>'</div>'.(basename(____page,".php")=="chat-2"?' ':'').''), | |
155 | + 'hide'=> array('type'=>BBCODE_TYPE_NOARG, 'childs'=>'', 'open_tag'=>'', 'close_tag'=>'', 'content_handling'=>'BBVoid'), | |
156 | + 'np'=> array('type'=>BBCODE_TYPE_NOARG, 'childs'=>'', 'open_tag'=>'', 'close_tag'=>''), | |
157 | + 'img'=> array('type'=>BBCODE_TYPE_NOARG, 'childs'=>'', 'open_tag'=>'<img src="{CONTENT}" alt="', 'close_tag'=>'" />', 'content_handling'=>'content_validate_url'), | |
158 | + 'swf'=> array('type'=>BBCODE_TYPE_NOARG, 'open_tag'=>'<object width="320" height="240"><param name="movie" value="{CONTENT}"></param><param name="wmode" value="transparent"></param><embed src="', 'close_tag'=>'" type="application/x-shockwave-flash" wmode="transparent" width="320" height="240"></embed></object>'), | |
159 | + 'quote'=> array('type'=>BBCODE_TYPE_OPTARG, 'flags'=>BBCODE_FLAGS_ARG_PARSING|BBCODE_FLAGS_REMOVE_IF_EMPTY, 'open_tag'=>'<fieldset><legend>{PARAM}</legend>', 'close_tag'=>'</fieldset>'.(basename(____page,".php")=="chat-2"?' ':'').'', 'default_arg'=>'Citation'), | |
160 | + 'id'=> array('type'=>BBCODE_TYPE_OPTARG, 'flags'=>BBCODE_FLAGS_REMOVE_IF_EMPTY, 'open_tag'=>'', 'close_tag'=>'', 'default_arg'=>'{SELF}', 'content_handling'=>'BBId2User'), | |
161 | + 'msg'=> array('type'=>BBCODE_TYPE_OPTARG, 'flags'=>BBCODE_FLAGS_REMOVE_IF_EMPTY, 'open_tag'=>'', 'close_tag'=>'', 'default_arg'=>'{SELF}', 'content_handling'=>'BBId2Msg'), | |
162 | + 'url'=> array('type'=>BBCODE_TYPE_OPTARG, 'flags'=>BBCODE_FLAGS_REMOVE_IF_EMPTY, 'open_tag'=>'<a href="{PARAM}">', 'close_tag'=>'</a>', 'default_arg'=>'{CONTENT}', 'param_handling'=>'validate_url', 'content_handling'=>'content_validate_url'), | |
163 | + 'mail'=> array('type'=>BBCODE_TYPE_OPTARG, 'flags'=>BBCODE_FLAGS_REMOVE_IF_EMPTY, 'open_tag'=>'<a href="mailto:{PARAM}">', 'close_tag'=>'</a>', 'default_arg'=>'{CONTENT}'), | |
164 | + 'border'=> array('type'=>BBCODE_TYPE_OPTARG, 'flags'=>BBCODE_FLAGS_REMOVE_IF_EMPTY, 'open_tag'=>'<div style="border:{PARAM}px solid;'.(basename(____page,".php")=="chat-2"?'margin-left:15px;padding-left:15px;':'').'">', 'close_tag'=>'</div>'.(basename(____page,".php")=="chat-2"?' ':'').'', 'default_arg'=>'5'), | |
165 | + 'list'=> array('type'=>BBCODE_TYPE_OPTARG, 'flags'=>BBCODE_FLAGS_REMOVE_IF_EMPTY, 'childs'=>'*', 'open_tag'=>'', 'close_tag'=>'', 'default_arg'=>'-1', 'content_handling'=>'BBList'), | |
166 | + '*'=> array('type'=>BBCODE_TYPE_NOARG, 'flags'=>BBCODE_FLAGS_REMOVE_IF_EMPTY|BBCODE_FLAGS_ONE_OPEN_PER_LEVEL, 'open_tag'=>'<li>', 'close_tag'=>'</li>'), | |
167 | + 'col'=> array('type'=>BBCODE_TYPE_OPTARG, 'flags'=>BBCODE_FLAGS_REMOVE_IF_EMPTY, 'open_tag'=>'<div style="-moz-column-count:{PARAM}; text-align:justify;-moz-column-gap:8px;'.(basename(____page,".php")=="chat-2"?'margin-left:15px;padding-left:15px;':'').'">', 'close_tag'=>'</div>'.(basename(____page,".php")=="chat-2"?' ':'').'', 'default_arg'=>'2'), | |
168 | + 'hexdump'=> array('type'=>BBCODE_TYPE_OPTARG, 'flags'=>BBCODE_FLAGS_REMOVE_IF_EMPTY, 'childs'=>'', 'open_tag'=>'[Hex Dump]<br />', 'close_tag'=>''.(basename(____page,".php")=="chat-2"?' ':'').'', 'default_arg'=>'0x345622', 'content_handling'=>'BBHexDump'), | |
169 | + 'bcktrc'=> array('type'=>BBCODE_TYPE_OPTARG, 'flags'=>BBCODE_FLAGS_REMOVE_IF_EMPTY, 'childs'=>'', 'open_tag'=>'', 'close_tag'=>''.(basename(____page,".php")=="chat-2"?' ':'').'', 'default_arg'=>'0x345622', 'content_handling'=>'BBBackTrace'), | |
170 | + 'bong'=> array('type'=>BBCODE_TYPE_OPTARG, 'flags'=>BBCODE_FLAGS_REMOVE_IF_EMPTY, 'childs'=>'onglet', 'open_tag'=>'<div id="{PARAM}"'.(basename(____page,".php")=="chat-2"?' style="margin-left:15px;padding-left:15px;"':'').'>', 'close_tag'=>'</div>'.(basename(____page,".php")=="chat-2"?' ':'').'<script type="text/javascript">new OngletsBlock(\'{PARAM}\');</script>','default_arg'=>'Fiche', 'param_handling'=>'random_id'), | |
171 | + 'onglet'=> array('type'=>BBCODE_TYPE_ARG, 'flags'=>BBCODE_FLAGS_REMOVE_IF_EMPTY, 'parents'=>'bong', 'open_tag'=>'<h4>{PARAM}</h4><div title="{PARAM}" closable="true" style="clear:both;'.(basename(____page,".php")=="chat-2"?'margin-left:15px;padding-left:15px;':'').'">','close_tag'=>'</div>','default_arg'=>'Default'), | |
172 | + 'color'=> array('type'=>BBCODE_TYPE_ARG, 'flags'=>BBCODE_FLAGS_REMOVE_IF_EMPTY, 'open_tag'=>'<span style="color:{PARAM}">', 'close_tag'=>'</span>'), | |
173 | + 'size'=> array('type'=>BBCODE_TYPE_ARG, 'flags'=>BBCODE_FLAGS_REMOVE_IF_EMPTY, 'open_tag'=>'<span style="font-size:{PARAM}px;">', 'close_tag'=>'</span>'), | |
174 | + 'goto'=> array('type'=>BBCODE_TYPE_ARG, 'flags'=>BBCODE_FLAGS_REMOVE_IF_EMPTY, 'open_tag'=>'<a href="#{PARAM}" onmouseover="this.href=document.location.href.replace(/#.*/img ,\'\')+\'#{PARAM}\'">', 'close_tag'=>'</a>'), | |
175 | + 'fade'=> array('type'=>BBCODE_TYPE_ARG, 'flags'=>BBCODE_FLAGS_REMOVE_IF_EMPTY, 'childs'=>'', 'open_tag'=>'', 'close_tag'=>'', 'content_handling'=>'BBDegrade'), | |
176 | + 'wave'=> array('type'=>BBCODE_TYPE_ARG, 'flags'=>BBCODE_FLAGS_REMOVE_IF_EMPTY, 'childs'=>'', 'open_tag'=>'', 'close_tag'=>'', 'content_handling'=>'BBWave'), | |
177 | + 'barre'=> array('type'=>BBCODE_TYPE_SINGLE, 'open_tag'=>'<hr />'.(basename(____page,".php")=="chat-2"?' ':'').''), | |
178 | +); | |
179 | +$arrayBBCode_meta=array( | |
180 | + 'b'=> array('name'=>'G', 'title'=>'Placer le texte en gras [b][/b]', 'style'=>'font-weight:bold;'), | |
181 | + 'u'=> array('name'=>'S', 'title'=>'Souligner le texte [u][/u]', 'style'=>'text-decoration:underline;'), | |
182 | + 'i'=> array('name'=>'I', 'title'=>'Placer le texte en italique[i][/i]', 'style'=>'font-style:italic;'), | |
183 | + 'm'=> array('name'=>'Marabou', 'title'=>'Faites de la pub pour le marabou![m][/m]'), | |
184 | + 'cap'=> array('name'=>'Majusc.', 'title'=>'Force le texte à être affiché en capitales [cap][/cap]', 'style'=>'text-transform:capitalize;'), | |
185 | + 'mini'=> array('name'=>'Mini', 'title'=>'Rendez votre texte tout petit [mini][/mini]', 'class'=>'mini'), | |
186 | + 'right'=> array('name'=>'Right', 'title'=>'Aligner votre texte à droite [right][/right]', 'style'=>'text-align:right;'), | |
187 | + 'center'=> array('name'=>'Center', 'title'=>'Centrer votre texte [center][/center]', 'style'=>'text-align:center;'), | |
188 | + 'just'=> array('name'=>'Justifié', 'title'=>'Justifier votre texte [just][/just]', 'style'=>'text-align:justify;'), | |
189 | + 'strike'=> array('name'=>'Strike', 'title'=>'Barre votre texte [strike] [/strike]', 'style'=>'text-decoration:line-through;'), | |
190 | + 'ancre'=> array('name'=>'Ancre', 'title'=>'Placez sur votre fiche un point de repere [ancre][/ancre]'), | |
191 | + 'moumou'=> 'hidden', | |
192 | + 'round'=> array('name'=>'Round', 'title'=>'Un cadre sur fond noir à bord arrondi à essayer [round][/round]', 'style'=>'border:2px double white;border-radius: 8px; padding:6px; -moz-border-radius: 8px; background-color:#000; color:#FFF;'), | |
193 | + 'hide'=> array('name'=>'Masquer', 'title'=>'Masquer le contenu (rendre invisible) [hide][/hide]'), | |
194 | + 'np'=> array('name'=>'Bloc non traité', 'title'=>'Défini un bloc dont le bbcode ne sera pas traité [np][/np]'), | |
195 | + 'quote'=> array('name'=>'Citation', 'title'=>'Faire une citation [quote]ou [quote=auteur] [/quote]', 'prompt'=>'Auteur de la citation (Esc si aucun)'), | |
196 | + 'id'=> array('name'=>'Lien Fiche', 'title'=>'Faire un lien vers la fiche d\'un utilisateur [id=115][/id]', 'prompt'=>'Id de l\'Ivyen?'), | |
197 | + 'url'=> array('name'=>'Lien', 'title'=>'Créez un lien à partir d\'une url [url] ou [url=http://...][/url]', 'prompt'=>'Url du lien avec http:// (Esc si url dans la balise)'), | |
198 | + 'img'=> array('name'=>'Image', 'title'=>'Créez un lien image [img]http://...[/img]', 'img_prompt'=>'Url de l\'image avec http:// '), | |
199 | + 'mail'=> array('name'=>'Lien Mail', 'title'=>'Créez un lien à partir d\'une url [mail] ou [mail=u@c.c][/mail]', 'prompt'=>'Adresse mail (Esc si adresse dans la balise)'), | |
200 | + 'border'=> array('name'=>'Bordure', 'title'=>'Créez un cadre avec une bordure [border] ou [border=X][/border]', 'prompt'=>'Taille de la bordure (Esc pour defaut)'), | |
201 | + 'list'=> array('name'=>'Listes', 'title'=>'Créez une liste avec puce [list] ou [list=X][*]element1[*]element2[/list]', 'prompt'=>'Type de liste: (1 / I / a / ...) ( Esc pour défaut )'), | |
202 | + 'col'=> array('name'=>'Colonnes', 'title'=>'Divise le texte en X colonnes (Firefox 1.5) [col=X][/col]', 'prompt'=>'Nombre de colonnes'), | |
203 | + 'hexdump'=> array('name'=>'HexDump', 'title'=>'HexDump (truc me faisant marrer, je suis désolé) [hexdump=0X3456][/hexdump]', 'prompt'=>'Adresse de démarrage format 0xFED3'), | |
204 | + 'bcktrc'=> array('name'=>'BackTrace', 'title'=>'BackTrace (comme HexDump) [bcktrc=0X3456][/bcktrc]', 'prompt'=>'Adresse de démarrage format 0xFED3'), | |
205 | + 'msg'=> array('name'=>'Lien Message','title'=>'Créer un lien direct pour envoyer un message à ivyen [msg=X][/msg]', 'prompt'=>'Id de l\'ivyen'), | |
206 | + 'color'=> array('name'=>'Couleur', 'title'=>'Défini la couleur du texte [color=XXX][/color]', 'prompt'=>'Entrez la couleur désirée', 'dropdown'=>array('aqua'=> 'Aqua', 'black'=> 'Noir', 'blue'=> 'Bleu', 'fuchsia'=> 'Fuschia', 'gray'=> 'Gris', 'green'=> 'Vert', 'lime'=> 'Citron Vert', 'maroon'=> 'Marron', 'navy'=> 'Bleu Marine', 'olive'=> 'Olive', 'purple'=> 'Violet', 'red'=> 'Rouge', 'silver'=> 'Argent', 'teal'=> 'Teal', 'white'=> 'Blanc', 'yellow'=> 'Jaune','--'=>'Couleur personnalisée', 'def'=>'Choisir couleur')), | |
207 | + 'size'=> array('name'=>'Size', 'title'=>'Taille du texte [size=XXX][/size]', 'dropdown'=>array('24'=> 'Gigantesque (24)', '20'=> 'Enorme (20)', '16'=> 'Grand(16)', '12'=> 'Normal(12)', '8'=> 'Petit(8)', 'def'=>'Taille du texte'),), | |
208 | + 'goto'=> array('name'=>'Goto', 'title'=>'Crée un lien vers une ancre du meme bloc [goto=X][/goto]', 'prompt'=>'Ancre à cibler'), | |
209 | + 'fade'=> array('name'=>'Dégradé', 'title'=>'Fournis des dégradés d\'une couleur à une autre [wave=XX:YY:ZZ:...][/wave] Séparez les couleurs par des : (donnez les couleurs en Hexa ex: 000000:FF0000:00FF00 (ne supporte pas les tags internes)', 'prompt'=>'Donnez les couleurs séparées par un : ex 0000FF:00FF00:FF0000'), | |
210 | + 'wave'=> array('name'=>'Vagues', 'title'=>'Fait aller en vague un texte [wave=XX:YY][/wave] avec les tailles oscillant entre XX et YY (ne supporte pas les tags internes)', 'prompt'=>'Donnez le min et le max séparés par un :'), | |
211 | + 'barre'=> array('name'=>'Barre', 'title'=>'Insere une barre horizontale [barre]'), | |
212 | +); | |
213 | + | |
214 | +$BBHandler=bbcode_create($arrayBBCode); | |
215 | +$array_smileys=array( | |
216 | + "[fight]" =>'/smileys/smile142.gif', | |
217 | + ":p" =>'/smileys/smile019.gif', | |
218 | + ":-/" =>'/smileys/smile046.gif', | |
219 | + "[fuck]" =>'/smileys/smile007.gif', | |
220 | + "[y]" =>'/smileys/smile054.gif', | |
221 | + "[l]" =>'/smileys/smile121.gif', | |
222 | + ":D" =>'/smileys/smile004.gif', | |
223 | + ":B" =>'/smileys/2pointsB.gif', | |
224 | + ":*" =>'/smileys/smile013.gif', | |
225 | + ":))))" =>'/smileys/smile008.gif', | |
226 | + ":))" =>'/smileys/smile005.gif', | |
227 | + ":)" =>'/smileys/smile147.gif', | |
228 | + ";)" =>'/smileys/smile144.gif', | |
229 | + ":(" =>'/smileys/smile001.gif', | |
230 | + ":'(" =>'/smileys/smile002.gif', | |
231 | + "[6]" =>'/smileys/smile006.gif', | |
232 | + ":@" =>'/smileys/smile003.gif', | |
233 | + ":o" =>'/smileys/smile145.gif', | |
234 | + ":$" =>'/smileys/smile146.gif', | |
235 | + ":cret:" =>'/smileys/lapin.png', | |
236 | + ":sm:" =>'/smileys/sm.gif', | |
237 | + "(8)" =>'/smileys/note.gif', | |
238 | + "", | |
239 | + "[vtff]" =>'/smileys/smile149.gif', | |
240 | + "[f]" =>'/smileys/smile143.gif', | |
241 | + "[bou]" =>'/smileys/smile148.gif', | |
242 | + "[serenade]"=>'/smileys/smile052.gif', | |
243 | + "[Love]" =>'/smileys/smile009.gif', | |
244 | + ); | |
245 | +$array_smileys_yahoo=array( | |
246 | + "yh;))" =>"/yahoo/yb671.gif", | |
247 | + "yh;)" =>"/yahoo/yb63.gif", | |
248 | + "yh;;)" =>"/yahoo/yb65.gif", | |
249 | + "yh:-/" =>"/yahoo/yb67.gif", | |
250 | + "yh:x" =>"/yahoo/yb68.gif", | |
251 | + "yh:-x" =>"/yahoo/yb68.gif", | |
252 | + "yh:\">" =>"/yahoo/yb69.gif", | |
253 | + "yh:-P" =>"/yahoo/yb610.gif", | |
254 | + "yh:P" =>"/yahoo/yb610.gif", | |
255 | + "yh:-*" =>"/yahoo/yb611.gif", | |
256 | + "yh:*" =>"/yahoo/yb611.gif", | |
257 | + "yh:-O" =>"/yahoo/yb613.gif", | |
258 | + "yhX-(" =>"/yahoo/yb614.gif", | |
259 | + "yh:->" =>"/yahoo/yb615.gif", | |
260 | + "yhB-)" =>"/yahoo/yb616.gif", | |
261 | + "yh:-S" =>"/yahoo/yb617.gif", | |
262 | + "yh>;:)" =>"/yahoo/yb619.gif", | |
263 | + "yh>:)" =>"/yahoo/yb619.gif", | |
264 | + "yh:((" =>"/yahoo/yb620.gif", | |
265 | + "yh:))" =>"/yahoo/yb621.gif", | |
266 | + "yh:|" =>"/yahoo/yb622.gif", | |
267 | + "yh/:)" =>"/yahoo/yb623.gif", | |
268 | + "yhO:-)" =>"/yahoo/yb625.gif", | |
269 | + "yh:-B" =>"/yahoo/yb626.gif", | |
270 | + "yh=;" =>"/yahoo/yb627.gif", | |
271 | + "yhI-)" =>"/yahoo/yb628.gif", | |
272 | + "yh|-)" =>"/yahoo/yb628.gif", | |
273 | + "yh8-|" =>"/yahoo/yb629.gif", | |
274 | + "yh:-$" =>"/yahoo/yb632.gif", | |
275 | + "yh[-(" =>"/yahoo/yb633.gif", | |
276 | + "yh:o)" =>"/yahoo/yb634.gif", | |
277 | + "yh8-}" =>"/yahoo/yb635.gif", | |
278 | + "yh(:|" =>"/yahoo/yb637.gif", | |
279 | + "yh=P~" =>"/yahoo/yb638.gif", | |
280 | + "yh:-?" =>"/yahoo/yb639.gif", | |
281 | + "yh#-o" =>"/yahoo/yb640.gif", | |
282 | + "yh=D>" =>"/yahoo/yb641.gif", | |
283 | + "yh:@)" =>"/yahoo/yb649.gif", | |
284 | + "yh3:-o" =>"/yahoo/yb650.gif", | |
285 | + "yh3:-0" =>"/yahoo/yb650.gif", | |
286 | + "yh:(|)" =>"/yahoo/yb651.gif", | |
287 | + "yh@};-" =>"/yahoo/yb653.gif", | |
288 | + "yh%%-" =>"/yahoo/yb654.gif", | |
289 | + "yh**==" =>"/yahoo/yb655.gif", | |
290 | + "yh(~~)" =>"/yahoo/yb656.gif", | |
291 | + "yh~o)" =>"/yahoo/yb657.gif", | |
292 | + "yh*-:)" =>"/yahoo/yb658.gif", | |
293 | + "yh8-x" =>"/yahoo/yb659.gif", | |
294 | + "yh=:)" =>"/yahoo/yb660.gif", | |
295 | + "yh>-)" =>"/yahoo/yb661.gif", | |
296 | + "yh:-L" =>"/yahoo/yb662.gif", | |
297 | + "yh>):)" =>"/yahoo/yb648.gif", | |
298 | + "yh[-o<" =>"/yahoo/yb663.gif", | |
299 | + "yh@-) " =>"/yahoo/yb643.gif", | |
300 | + "yh$-)" =>"/yahoo/yb664.gif", | |
301 | + "yh:-\"" =>"/yahoo/yb665.gif", | |
302 | + "yh:^O" =>"/yahoo/yb644.gif", | |
303 | + "yhb-(" =>"/yahoo/yb666.gif", | |
304 | + "yh:)>-" =>"/yahoo/yb667.gif", | |
305 | + "yh[-X" =>"/yahoo/yb668.gif", | |
306 | + "yh\\:D/" =>"/yahoo/wbyim59.gif", | |
307 | + "yh>:D<" =>"/yahoo/yb66.gif", | |
308 | + "yh=))" =>"/yahoo/yb624.gif", | |
309 | + "yhL-)" =>"/yahoo/yb630.gif", | |
310 | + "yh:-w" =>"/yahoo/yb645.gif", | |
311 | + "yh:-<" =>"/yahoo/yb646.gif", | |
312 | + "yh>:P" =>"/yahoo/yb647.gif", | |
313 | + "yh>:/" =>"/yahoo/yb670.gif", | |
314 | + "yh:-@" =>"/yahoo/yb676.gif", | |
315 | + "yh^:)^" =>"/yahoo/yb677.gif", | |
316 | + "yh:-j" =>"/yahoo/yb678.gif", | |
317 | + "yh(*)" =>"/yahoo/yb679.gif", | |
318 | + "yh:D" =>"/yahoo/yb64.gif", | |
319 | + "yh:(" =>"/yahoo/yb62.gif", | |
320 | + "yh:)" =>"/yahoo/yb61.gif", | |
321 | + "yh:-&" =>"/yahoo/yb631.gif", | |
322 | + ); | |
323 | + | |
324 | +foreach($array_smileys as $smil=>$replacement){ | |
325 | + $replacement=" <img src=\"http://images.ivynet.org".$replacement."\" alt=\"".($smil)."\" /> "; | |
326 | + bbcode_add_smiley($BBHandler,$smil,$replacement); | |
327 | +} | |
328 | +foreach($array_smileys_yahoo as $smil=>$replacement){ | |
329 | + $replacement=" <img src=\"http://images.ivynet.org".$replacement."\" alt=\"".($smil)."\" /> "; | |
330 | + bbcode_add_smiley($BBHandler,$smil,$replacement); | |
331 | +} | |
332 | +bbcode_set_flags($BBHandler,BBCODE_CORRECT_REOPEN_TAGS | BBCODE_ARG_DOUBLE_QUOTE | BBCODE_ARG_SINGLE_QUOTE | BBCODE_ARG_HTML_QUOTE | BBCODE_AUTO_CORRECT, BBCODE_SET_FLAGS_SET); | |
333 | +if (!function_exists('bbCode')){ | |
334 | + function bbCode($message){ | |
335 | + global $BBHandler; | |
336 | + $err=error_reporting(E_ALL); | |
337 | + $message=bbcode_parse($BBHandler,$message); | |
338 | + $message=str_replace(" "," ",$message); | |
339 | + error_reporting($err); | |
340 | + return $message; | |
341 | + //$BBHandler->treat($message); | |
342 | + //return $message; | |
343 | + } | |
344 | +} | |
345 | + | |
346 | +function BBSize($content,$param){ | |
347 | + $param=min(24,max(4,$param)); | |
348 | + return $param; | |
349 | +} | |
350 | +function BBList($content,$param){ | |
351 | + if ($param=="-1"){ | |
352 | + return '<ul>'.$content.'</ul>'; | |
353 | + } else { | |
354 | + return '<ol type="'.$param.'">'.$content.'</ol>'; | |
355 | + } | |
356 | +} | |
357 | +function BBInt($content,$param){ | |
358 | + $param= (int) $param; | |
359 | + return $param; | |
360 | +} | |
361 | +function BBBorder($content,$param){ | |
362 | + $param= min(8,max(1,$param)); | |
363 | + return $param; | |
364 | +} | |
365 | +function bbid2user($content,$param){ | |
366 | + if ($param=='{SELF}'){ | |
367 | + $param=(int)$content; | |
368 | + $content='pseudo'; | |
369 | + } | |
370 | + $id=$param; | |
371 | + $content="<a href='".$content."'>".$content."</a>"; | |
372 | + return $content; | |
373 | +} | |
374 | +function BBId2Msg($content,$param){ | |
375 | + if ($param=='{SELF}'){ | |
376 | + $param=(int)$content; | |
377 | + $content='pseudo'; | |
378 | + } | |
379 | + $id=$param; | |
380 | + $content="<a href='/message.php?destinataire=$id'>".html_encode_string($content)."</a>"; | |
381 | + return $content; | |
382 | +} | |
383 | +function BBWave($content,$param="8:24"){ | |
384 | + if ($_GET['page']=="chat-2.php"){ | |
385 | + return ("[wave=$param]".$content."[/wave]"); | |
386 | + } | |
387 | + $content=str_replace("\r\n","\n",$content); | |
388 | + $string=preg_split('//u',html_entity_decode(strip_tags($content),ENT_QUOTES,"UTF-8"),-1,PREG_SPLIT_NO_EMPTY); | |
389 | + list ($min, $max)=explode(":",$param); | |
390 | + $out=""; | |
391 | + if ($max==$min){ | |
392 | + return true; | |
393 | + } | |
394 | + if ($max<$min){ | |
395 | + $tmp=$max; | |
396 | + $max=$min; | |
397 | + $min=$tmp; | |
398 | + } | |
399 | + if (strlen($content)<$max-$min && $content!=0){ | |
400 | + $step=round(($max-$min)/$content); | |
401 | + } | |
402 | + else{ | |
403 | + $step=1; | |
404 | + } | |
405 | + $i=$min; | |
406 | + $up=true; | |
407 | + foreach ($string as $car){ | |
408 | + $car=html_encode_string($car); | |
409 | + $out.="<span style='font-size:".$i."px;'>".$car."</span>"; | |
410 | + if ($up){ | |
411 | + $i+=$step; | |
412 | + }else { | |
413 | + $i-=$step; | |
414 | + } | |
415 | + if ($i>=$max){ | |
416 | + $up=false; | |
417 | + $i=$max; | |
418 | + } | |
419 | + elseif($i<=$min){ | |
420 | + $up=true; | |
421 | + $i=$min; | |
422 | + } | |
423 | + } | |
424 | + $content=$out; | |
425 | + return $content; | |
426 | +} | |
427 | +function shortenAuthor($content,$param=""){ | |
428 | + if (strlen($param)>150){ | |
429 | + $param=substr($param,0,150); | |
430 | + } | |
431 | + return $param; | |
432 | +} | |
433 | +function BBDegrade($content,$param=""){ | |
434 | + $content=str_replace("\r\n","\n",$content); | |
435 | + $string=preg_split('//u',html_entity_decode(strip_tags($content),ENT_QUOTES,"UTF-8"),-1,PREG_SPLIT_NO_EMPTY); | |
436 | + $colors=explode(":",$param); | |
437 | + $out=""; | |
438 | + foreach($colors as $v){ | |
439 | + $col[]=array('r'=>base_convert(substr($v,0,2),16,10),'g'=>base_convert(substr($v,2,2),16,10),'b'=>base_convert(substr($v,4,6),16,10)); | |
440 | + } | |
441 | + $str_size=sizeof($string); | |
442 | + $nb_col=sizeof($col); | |
443 | + if ($nb_col<2) | |
444 | + { | |
445 | + return $content; | |
446 | + } | |
447 | + $steps=max(round($str_size/($nb_col-1)),1); | |
448 | + $last=null; | |
449 | + foreach ($string as $k=>$car){ | |
450 | + $car=html_encode_string($car); | |
451 | + if ($k%$steps==0){ | |
452 | + $nb=$k/$steps; | |
453 | + $r=sprintf("%02x",$col[$nb]['r']); | |
454 | + $g=sprintf("%02x",$col[$nb]['g']); | |
455 | + $b=sprintf("%02x",$col[$nb]['b']); | |
456 | + } | |
457 | + elseif($k>($steps*($nb_col-1))){ | |
458 | + $nb=$nb_col-1; | |
459 | + $r=sprintf("%02x",$col[$nb]['r']); | |
460 | + $g=sprintf("%02x",$col[$nb]['g']); | |
461 | + $b=sprintf("%02x",$col[$nb]['b']); | |
462 | + }else{ | |
463 | + $nb=ceil($k/$steps); | |
464 | + $r=sprintf("%02x",(abs(round($col[$nb-1]['r']-((($col[$nb-1]['r']-$col[$nb]['r'])/$steps)*($k%$steps)))))); | |
465 | + $g=sprintf("%02x",(abs(round($col[$nb-1]['g']-((($col[$nb-1]['g']-$col[$nb]['g'])/$steps)*($k%$steps)))))); | |
466 | + $b=sprintf("%02x",(abs(round($col[$nb-1]['b']-((($col[$nb-1]['b']-$col[$nb]['b'])/$steps)*($k%$steps)))))); | |
467 | + } | |
468 | + $current=$r.$g.$b; | |
469 | + if (is_null($last)){ | |
470 | + $first=$current; | |
471 | + } | |
472 | + if ($current!=$last){ | |
473 | + $out.='</span><span style="color:#'.$current.';">'; | |
474 | + $last=$current; | |
475 | + } | |
476 | + $out.=$car; | |
477 | + } | |
478 | + $out.='</span>'; | |
479 | + return substr($out,strlen('</span>')); | |
480 | +} | |
481 | +function BBVoid($content,$param){ | |
482 | + return " "; | |
483 | +} | |
484 | +function BBBackTrace($string,$base) | |
485 | +{ | |
486 | + $string=br2nl($string); | |
487 | + $base=base_convert($base,16,10); | |
488 | + $step=16; | |
489 | + $tmp=""; | |
490 | + $i=0; | |
491 | + while ($i<strlen($string)) | |
492 | + { | |
493 | + $tmp.="[<b>0x".base_convert($base+$i,10,16)."-0x".base_convert($base+$i+$step-1,10,16)."</b> : \"".addcslashes(substr($string,$i,$step),"\n\t\\'\"\0")."\"]<br />\n"; | |
494 | + $i+=$step; | |
495 | + } | |
496 | + $string=$tmp; | |
497 | + return $string; | |
498 | +} | |
499 | +function BBHexDump($string,$base) | |
500 | +{ | |
501 | + $string=br2nl($string); | |
502 | + $base=base_convert($base,16,10); | |
503 | + $step=16; | |
504 | + $tmp=""; | |
505 | + $i=0; | |
506 | + while ($i<strlen($string)) | |
507 | + { | |
508 | + $tmp.="[<b>0x".base_convert($base+$i,10,16)."-0x".base_convert($base+$i+$step-1,10,16)."</b> : 0x"; | |
509 | + for ($j=0;$j<$step;$j++){ | |
510 | + $tmp.=sprintf("%02x",ord(substr($string,$i+$j,1))); | |
511 | + } | |
512 | + $tmp.="]<br />\n"; | |
513 | + $i+=$step; | |
514 | + } | |
515 | + $string=$tmp; | |
516 | + return $string; | |
517 | +} | |
518 | +function random_id($content, $param){ | |
519 | + return uniqid($param."_"); | |
520 | +} | |
521 | +function content_validate_url($content,$param){ | |
522 | + if ($param=="{CONTENT}"){ | |
523 | + return validate_url($param,$content); | |
524 | + } | |
525 | + return $content; | |
526 | +} | |
527 | +function validate_url($content, $param){ | |
528 | +} | |
529 | +//$text="[i] Parser [b] Auto Correction [/i] at work [/b]\n"; | |
530 | +bbCode($text); | |
531 | +bbCode($text); | |
532 | +bbCode($text); | |
533 | +bbCode($text); | |
534 | +bbCode($text); | |
535 | +bbCode($text); | |
536 | +bbcode_destroy($BBHandler); | |
537 | +echo "Nothing"; | |
538 | +?> | |
539 | +--EXPECT-- | |
540 | +Nothing | |
541 | ||
542 | Property changes on: tests/test_ivy.phpt | |
543 | ___________________________________________________________________ | |
544 | Added: svn:eol-style | |
545 | + native | |
546 | Added: svn:keywords | |
547 | + Id Rev Revision Date LastChangedDate LastChangedRevision Author LastChangedBy HeadURL URL | |
548 | Added: cvs2svn:cvs-rev | |
549 | + 1.4 | |
550 | ||
551 | Index: tests/test_26.phpt | |
552 | =================================================================== | |
553 | --- tests/test_26.phpt (.../tags/RELEASE_1_0_2) | |
554 | +++ tests/test_26.phpt (.../trunk) | |
555 | @@ -0,0 +1,84 @@ | |
556 | +--TEST-- | |
557 | +BBCODE Param and Content Callbacks | |
558 | +--FILE-- | |
559 | +<?php | |
560 | +if (!extension_loaded('bbcode')){ | |
561 | + if (!dl('bbcode.so')){ | |
562 | + die ('bbcode not loadable'); | |
563 | + } | |
564 | +} | |
565 | +Class Foo_C{ | |
566 | + static function bar($content,$param){ | |
567 | + return "Foo_C::bar ".$content; | |
568 | + } | |
569 | + function foo($content, $param) { | |
570 | + return "Foo_C->foo_cb() ".$content; | |
571 | + } | |
572 | +} | |
573 | +function C_callback($content, $param){ | |
574 | + return "C_Callback ".$content; | |
575 | +} | |
576 | +Class Foo_P{ | |
577 | + static function bar($content,$param){ | |
578 | + return "Foo_P::bar ".$param; | |
579 | + } | |
580 | + function foo($content, $param) { | |
581 | + return "Foo_P->foo() ".$param; | |
582 | + } | |
583 | +} | |
584 | +function P_callback($content, $param){ | |
585 | + return "P_Callback ".$param; | |
586 | +} | |
587 | +function f_empty(){} | |
588 | + | |
589 | +$foo_C = new Foo_C; | |
590 | +$foo_P = new Foo_P; | |
591 | + | |
592 | +$arrayBBCode=array( | |
593 | + 'i'=> array('type' => BBCODE_TYPE_ARG, 'open_tag' => '<i {PARAM}>', 'close_tag' => '</i>', | |
594 | + 'content_handling' => array('Foo_C', 'bar'), | |
595 | + 'param_handling' => array('Foo_P', 'bar'), | |
596 | + ), | |
597 | + 'b'=> array('type' => BBCODE_TYPE_ARG, 'open_tag' => '<b {PARAM}>', 'close_tag' => '</b>', | |
598 | + 'content_handling' => array($foo_C, 'foo'), | |
599 | + 'param_handling' => array($foo_P, 'foo'), | |
600 | + ), | |
601 | + 'u'=> array('type' => BBCODE_TYPE_ARG, 'open_tag' => '<u {PARAM}>', 'close_tag' => '</u>', | |
602 | + 'content_handling' => 'C_callback', | |
603 | + 'param_handling' => 'P_callback', | |
604 | + ), | |
605 | + 'e'=> array('type' => BBCODE_TYPE_ARG, 'open_tag' => '<e {PARAM}>', 'close_tag' => '</e>', | |
606 | + 'content_handling' => 'f_empty', | |
607 | + 'param_handling' => 'f_empty', | |
608 | + ), | |
609 | +); | |
610 | +$text=<<<EOF | |
611 | +[u=aa]Underlined Text[/u] | |
612 | +[i=aa]Italic Text[/i] | |
613 | +[b=aa]Bold Text[/b] | |
614 | +[e=aa]Emptied Text[/e] | |
615 | +EOF; | |
616 | +$BBHandler = bbcode_create($arrayBBCode); | |
617 | +echo "== Run #1 ==\n", bbcode_parse($BBHandler,$text); | |
618 | +echo "\n"; | |
619 | +echo "== Run #2 ==\n", bbcode_parse($BBHandler,$text); | |
620 | +echo "\n"; | |
621 | +echo "== Run #3 ==\n", bbcode_parse($BBHandler,$text); | |
622 | +bbcode_destroy($BBHandler); | |
623 | +?> | |
624 | +--EXPECT-- | |
625 | +== Run #1 == | |
626 | +<u P_Callback aa>C_Callback Underlined Text</u> | |
627 | +<i Foo_P::bar aa>Foo_C::bar Italic Text</i> | |
628 | +<b Foo_P->foo() aa>Foo_C->foo_cb() Bold Text</b> | |
629 | +<e ></e> | |
630 | +== Run #2 == | |
631 | +<u P_Callback aa>C_Callback Underlined Text</u> | |
632 | +<i Foo_P::bar aa>Foo_C::bar Italic Text</i> | |
633 | +<b Foo_P->foo() aa>Foo_C->foo_cb() Bold Text</b> | |
634 | +<e ></e> | |
635 | +== Run #3 == | |
636 | +<u P_Callback aa>C_Callback Underlined Text</u> | |
637 | +<i Foo_P::bar aa>Foo_C::bar Italic Text</i> | |
638 | +<b Foo_P->foo() aa>Foo_C->foo_cb() Bold Text</b> | |
639 | +<e ></e> | |
640 | ||
641 | Property changes on: tests/test_26.phpt | |
642 | ___________________________________________________________________ | |
643 | Added: svn:eol-style | |
644 | + native | |
645 | Added: svn:keywords | |
646 | + Id Rev Revision Date LastChangedDate LastChangedRevision Author LastChangedBy HeadURL URL | |
647 | Added: cvs2svn:cvs-rev | |
648 | + 1.1 | |
649 | ||
650 | Index: tests/test_27.phpt | |
651 | =================================================================== | |
652 | --- tests/test_27.phpt (.../tags/RELEASE_1_0_2) | |
653 | +++ tests/test_27.phpt (.../trunk) | |
654 | @@ -0,0 +1,25 @@ | |
655 | +--TEST-- | |
656 | +BBCODE Invalid quote segfaults | |
657 | +--SKIP-- | |
658 | +<?php | |
659 | +if (!extension_loaded('bbcode')){ | |
660 | + die ('skip bbcode not loadable'); | |
661 | +} | |
662 | +?> | |
663 | +--FILE-- | |
664 | +<?php | |
665 | + | |
666 | +$text = <<< MSG | |
667 | +[quote=a]foo[/quote] | |
668 | +[quote="b]bar[/quote] | |
669 | +MSG; | |
670 | + | |
671 | +$BBCode = array( | |
672 | + 'quote' => array('type'=> BBCODE_TYPE_OPTARG), | |
673 | +); | |
674 | + | |
675 | +echo bbcode_parse(bbcode_create($BBCode), $text); | |
676 | +?> | |
677 | +--EXPECT-- | |
678 | +foo | |
679 | +[quote="b]bar[/quote] | |
680 | ||
681 | Property changes on: tests/test_27.phpt | |
682 | ___________________________________________________________________ | |
683 | Added: svn:eol-style | |
684 | + native | |
685 | Added: svn:keywords | |
686 | + Id Rev Revision Date LastChangedDate LastChangedRevision Author LastChangedBy HeadURL URL | |
687 | Added: cvs2svn:cvs-rev | |
688 | + 1.1 | |
689 | ||
690 | ||
691 | Property changes on: tests | |
692 | ___________________________________________________________________ | |
693 | Added: svn:ignore | |
694 | + *.diff | |
695 | *.mem | |
696 | *.log | |
697 | *.out | |
698 | *.exp | |
699 | *.swp | |
700 | *.php | |
701 | phpt.* | |
702 | ||
703 | ||
704 | Index: bbcode.php | |
705 | =================================================================== | |
706 | --- bbcode.php (.../tags/RELEASE_1_0_2) | |
707 | +++ bbcode.php (.../trunk) | |
708 | @@ -0,0 +1,989 @@ | |
709 | +<?php | |
710 | +/** | |
711 | + * BBCode Library | |
712 | + * | |
713 | + */ | |
714 | +/** | |
715 | + * A complex BBCode Tags Parser | |
716 | + * | |
717 | + * The BBCode Array Arguments | |
718 | + * childs | |
719 | + * close_tag | |
720 | + * content_handling | |
721 | + * default_arg | |
722 | + * flags > BBCode::FLAGS_* | |
723 | + * open_tag | |
724 | + * parents | |
725 | + * param_handling | |
726 | + * type > BBCode::TYPE_* | |
727 | + */ | |
728 | +Class BBCode{ | |
729 | + const TYPE_NOARG= 1; | |
730 | + const TYPE_SINGLE= 2; | |
731 | + const TYPE_ARG= 3; | |
732 | + const TYPE_OPTARG= 4; | |
733 | + const TYPE_ROOT= 10; | |
734 | + | |
735 | + // Flags | |
736 | + const FLAGS_ARG_PARSING= 1; | |
737 | + const FLAGS_CDATA_NOT_ALLOWED= 2; | |
738 | + const FLAGS_SMILEYS_ON= 4; | |
739 | + const FLAGS_SMILEYS_OFF= 8; | |
740 | + const FLAGS_ONE_OPEN_PER_LEVEL= 16; | |
741 | + /* Quote style accepted */ | |
742 | + /** | |
743 | + * Accepts args with no quotes ([tag=arg]) | |
744 | + * Cannot be disabled | |
745 | + */ | |
746 | + const ARG_NO_QUOTE=0; | |
747 | + /** | |
748 | + * Accepts args with double quotes ([tag="arg"]) | |
749 | + */ | |
750 | + const ARG_DOUBLE_QUOTE=1; | |
751 | + /** | |
752 | + * Accepts args with single quotes ([tag='arg']) | |
753 | + * one of the Double / Single quote is needed for subparsing | |
754 | + */ | |
755 | + const ARG_SINGLE_QUOTE=2; | |
756 | + | |
757 | + /** | |
758 | + * Enable autocorrection of HTML By closing "still opened tags" | |
759 | + * | |
760 | + * @var boolean | |
761 | + */ | |
762 | + public $auto_correct=true; | |
763 | + /** | |
764 | + * If tags are incorrectly nested, they are closed and reopened | |
765 | + * after the previous tag close | |
766 | + * | |
767 | + * @var boolean | |
768 | + */ | |
769 | + public $correct_reopen_tags=true; | |
770 | + /** | |
771 | + * Indicate wheter smileys are treated or not if no tag level | |
772 | + * instructions override this | |
773 | + * | |
774 | + * @var boolean | |
775 | + */ | |
776 | + public $default_smileys=true; | |
777 | + /** | |
778 | + * Indicates what styles of quotes are accepted | |
779 | + * | |
780 | + * @var int | |
781 | + */ | |
782 | + public $quote_styles; | |
783 | + /** | |
784 | + * Disable BBCode Parsing | |
785 | + * | |
786 | + * @var boolean | |
787 | + */ | |
788 | + public $noTreeBuild=false; | |
789 | + /** | |
790 | + * Disable Smileys | |
791 | + * | |
792 | + * @var boolean | |
793 | + */ | |
794 | + public $force_smileys_off=false; | |
795 | + | |
796 | + /** | |
797 | + * Privates Vars | |
798 | + * | |
799 | + * @var BBCode - if a specific parser is needed for argument parsing | |
800 | + */ | |
801 | + private $arg_parser=null; | |
802 | + | |
803 | + /** | |
804 | + * The internal working Tree | |
805 | + * | |
806 | + * @var Array | |
807 | + */ | |
808 | + private $tree; | |
809 | + /** | |
810 | + * Lists Levels to access the root level | |
811 | + * @var array | |
812 | + */ | |
813 | + private $stack; | |
814 | + /** | |
815 | + * An index to lists tags opened through the stack | |
816 | + * @var array | |
817 | + */ | |
818 | + private $stackIndex; | |
819 | + /** | |
820 | + * The active Node | |
821 | + * @var array | |
822 | + */ | |
823 | + private $currentNode; | |
824 | + /** | |
825 | + * Lists of unclosed stack | |
826 | + * @var array | |
827 | + */ | |
828 | + private $toClose; | |
829 | + /** | |
830 | + * An index to lists unclosed tag | |
831 | + * @var array | |
832 | + */ | |
833 | + private $toCloseIndex; | |
834 | + | |
835 | + /** | |
836 | + * The List of tags (external representation) | |
837 | + * | |
838 | + * @var array | |
839 | + */ | |
840 | + private $tagList; | |
841 | + /** | |
842 | + * The List of tags (internal representation) | |
843 | + * | |
844 | + * @var array | |
845 | + */ | |
846 | + private $tagListCache; | |
847 | + /** | |
848 | + * The index to map TagName to tagid | |
849 | + * | |
850 | + * @var array | |
851 | + */ | |
852 | + private $tagListIndex; | |
853 | + /** | |
854 | + * The list of smileys | |
855 | + * | |
856 | + * @var array | |
857 | + */ | |
858 | + private $smileys; | |
859 | + | |
860 | + private $close_time=0; | |
861 | + private $add_time=0; | |
862 | + | |
863 | + /** | |
864 | + * The Constructor | |
865 | + * | |
866 | + * @param array $tag_init a list of BBCode for quick init | |
867 | + * @param array $smileys_init a list of smileys for quick init | |
868 | + */ | |
869 | + public function __construct($tag_init=null,$smileys_init=null){ | |
870 | + $this->tagList=$this->smileys=array(); | |
871 | + if (is_array($tag_init)){ | |
872 | + $this->tagList=$tag_init; | |
873 | + $this->tagListCache=null; | |
874 | + } | |
875 | + if (is_array($smileys_init)){ | |
876 | + $this->smileys=$smileys_init; | |
877 | + } | |
878 | + $this->quote_styles=self::ARG_NO_QUOTE|self::ARG_DOUBLE_QUOTE|self::ARG_SINGLE_QUOTE; | |
879 | + $this->tree=null; | |
880 | + } | |
881 | + /** | |
882 | + * Attach a parser as argument sub-parser | |
883 | + * | |
884 | + * @param BBCode $bbcode_parser | |
885 | + */ | |
886 | + public function set_arg_parser($bbcode_parser){ | |
887 | + $this->arg_parser=null; | |
888 | + if ($bbcode_parser instanceof BBCode){ | |
889 | + $this->arg_parser=$bbcode_parser; | |
890 | + } | |
891 | + } | |
892 | + /** | |
893 | + * This function is there to add an individual tag to the list | |
894 | + * | |
895 | + * @param string $tag_name | |
896 | + * @param array $array | |
897 | + */ | |
898 | + public function add_element($tag_name,$array){ | |
899 | + $this->tagList[$tag_name]=$array; | |
900 | + $this->tagListCache=null; | |
901 | + } | |
902 | + /** | |
903 | + * Adds an individual smiley to the list | |
904 | + * | |
905 | + * @param string $smiley | |
906 | + * @param string $replacement | |
907 | + */ | |
908 | + public function attach_smileys($smiley, $replacement){ | |
909 | + $this->smileys[$smiley]=$replacement; | |
910 | + } | |
911 | + | |
912 | + /** | |
913 | + * Parse a string from BBCode following the rules given | |
914 | + * | |
915 | + * @param String $string | |
916 | + * @return string | |
917 | + */ | |
918 | + public function parse($string){ | |
919 | + // Init | |
920 | + $this->toCloseIndex=$this->toClose=$this->stackIndex=$this->stack=array(); | |
921 | + $this->tree=null; | |
922 | + if ($this->noTreeBuild){ | |
923 | + $this->tree=array('i'=>$this->get_tag_id(''),'p'=>true,'s'=>''); | |
924 | + $this->tree['c'][] = $string; | |
925 | + } else { | |
926 | + $this->prepareTagList(); | |
927 | + // Tree construction | |
928 | + $this->build_tree($string); | |
929 | + // Tree corrections and fetch | |
930 | + $this->correct_tree(); | |
931 | + } | |
932 | + // Conversion | |
933 | + return $this->apply_rules($this->tree); | |
934 | + } | |
935 | + | |
936 | + /** | |
937 | + * Convert external representation of the taglist to internal | |
938 | + * | |
939 | + */ | |
940 | + private function prepareTagList(){ | |
941 | + if ($this->tagListCache!=null){ | |
942 | + return; | |
943 | + } | |
944 | + if (!isset($this->tagList[''])){ | |
945 | + $this->tagList['']=array(); | |
946 | + } | |
947 | + $i=0; | |
948 | + // 1. Populate the tagListCache | |
949 | + $all=array(); | |
950 | + foreach($this->tagList as $tag=>$tag_datas){ | |
951 | + $all[]=$i; | |
952 | + $this->tagListIndex[$tag]=$i; | |
953 | + /** | |
954 | + * Internal fields: | |
955 | + * | |
956 | + * 0 'type' | |
957 | + * 1 'open_tag' | |
958 | + * 2 'close_tag' | |
959 | + * 3 'default_arg' | |
960 | + * 4 'flags' | |
961 | + * 5 'parents' | |
962 | + * 6 'childs' | |
963 | + * 7 'content_handling' | |
964 | + * 8 'content_handling_is_callback' | |
965 | + * 9 'param_handling' | |
966 | + * 10 'param_handling_is_callback' | |
967 | + * 11 'accept_arg' | |
968 | + * 12 'accept_noarg' | |
969 | + * 13 'start_has_bracket_open' | |
970 | + * 14 'end_has_bracket_open' | |
971 | + * 15 'accept_smileys' | |
972 | + */ | |
973 | + $type=isset($tag_datas['type'])?$tag_datas['type']:BBCODE_TYPE_NOARG; | |
974 | + $start=isset($tag_datas['open_tag'])?$tag_datas['open_tag']:''; | |
975 | + $end=isset($tag_datas['close_tag'])?$tag_datas['close_tag']:''; | |
976 | + $flags=isset($tag_datas['flags'])?$tag_datas['flags']:0; | |
977 | + $this->tagListCache[$i]=array($type, | |
978 | + $start, | |
979 | + $end, | |
980 | + isset($tag_datas['default_arg'])?$tag_datas['default_arg']:'', | |
981 | + $flags, | |
982 | + isset($tag_datas['parents'])?$tag_datas['parents']:'all', | |
983 | + isset($tag_datas['childs'])?$tag_datas['childs']:'all', | |
984 | + isset($tag_datas['content_handling'])?$tag['content_handling']:'', | |
985 | + null, | |
986 | + isset($tag_datas['param_handling'])?$tag['param_handling']:'', | |
987 | + null, | |
988 | + (bool)($type==BBCode::TYPE_ARG || $type==BBCode::TYPE_OPTARG), | |
989 | + (bool)($type==BBCode::TYPE_NOARG || $type==BBCode::TYPE_OPTARG || $type==BBCode::TYPE_SINGLE), | |
990 | + (bool)(strpos($start,"{")), | |
991 | + (bool)(strpos($end,"{")), | |
992 | + ((($flags&(BBCode::FLAGS_SMILEYS_OFF|BBCode::FLAGS_SMILEYS_ON))==0)&& $this->default_smileys ) || $flags&(BBCode::FLAGS_SMILEYS_ON), | |
993 | + ); | |
994 | + ++$i; | |
995 | + } | |
996 | + // 2. Parse Child / Parents List | |
997 | + foreach($this->tagListCache as $i=>$val){ | |
998 | + // Childs | |
999 | + if ($val[6]=='all'){ | |
1000 | + $val[6]=$all; | |
1001 | + } elseif ($val[6]==''){ | |
1002 | + $val[6]=array(); | |
1003 | + } elseif ($val[6][0]=='!'){ | |
1004 | + $values=explode(',',substr($val[6],1)); | |
1005 | + $val[6]=$all; | |
1006 | + foreach ($values as $element){ | |
1007 | + if($tag_id=$this->get_tag_id($element)){ | |
1008 | + $pos=array_search($tag_id,$val[6]); | |
1009 | + unset($val[6][$pos]); | |
1010 | + } | |
1011 | + } | |
1012 | + } else { | |
1013 | + $values=explode(',',$val[6]); | |
1014 | + foreach ($values as $element){ | |
1015 | + $val[6]=array(); | |
1016 | + if($tag_id=$this->get_tag_id($element)){ | |
1017 | + $val[6][]=$tag_id; | |
1018 | + } | |
1019 | + } | |
1020 | + } | |
1021 | + //Parents | |
1022 | + if ($val[5]=='all'){ | |
1023 | + $val[5]=$all; | |
1024 | + } elseif ($val[5]==''){ | |
1025 | + $val[5]=array(); | |
1026 | + } elseif ($val[5][0]=='!'){ | |
1027 | + $val[5]=$all; | |
1028 | + $values=explode(',',substr($val[5],1)); | |
1029 | + foreach ($values as $element){ | |
1030 | + $val[5]=array(); | |
1031 | + if($tag_id=$this->get_tag_id($element)){ | |
1032 | + $pos=array_search($val[5],$tag_id); | |
1033 | + unset($val[5][$pos]); | |
1034 | + } | |
1035 | + } | |
1036 | + } else { | |
1037 | + $values=explode(',',$val[5]); | |
1038 | + foreach ($values as $element){ | |
1039 | + $val[5]=array(); | |
1040 | + if($tag_id=$this->get_tag_id($element)){ | |
1041 | + $val[5][]=$tag_id; | |
1042 | + } | |
1043 | + } | |
1044 | + } | |
1045 | + $this->tagListCache[$i]=$val; | |
1046 | + } | |
1047 | + } | |
1048 | + | |
1049 | + /** | |
1050 | + * Build the tree representation of the given string | |
1051 | + * | |
1052 | + * @param string $string | |
1053 | + */ | |
1054 | + private function build_tree($string){ | |
1055 | + $strlen=strlen($string); | |
1056 | + $quote_double=(bool)$this->quote_styles&self::ARG_DOUBLE_QUOTE; | |
1057 | + $quote_single=(bool)$this->quote_styles&self::ARG_SINGLE_QUOTE ; | |
1058 | + $end_quote=""; | |
1059 | + $end=0; | |
1060 | + $this->tree=array('i'=>$this->get_tag_id(''),'p'=>true,'s'=>''); | |
1061 | + $this->currentNode =& $this->tree; | |
1062 | + // Init Working Var | |
1063 | + $next_close=$next_equal=0; | |
1064 | + $offset=strpos($string,'['); | |
1065 | + $this->add_child(substr($string,0,$offset)); | |
1066 | + do { | |
1067 | + $added=false; | |
1068 | + if ($string[$offset]=='['){ | |
1069 | + if (($string[$offset+1])!='/'){ | |
1070 | + //Open | |
1071 | + // Equal | |
1072 | + if ($next_equal<=$offset){ | |
1073 | + if (false===$next_equal=strpos($string,'=',$offset)){ | |
1074 | + $next_equal=$strlen+5; | |
1075 | + } | |
1076 | + } | |
1077 | + if ($next_close<=$offset){ | |
1078 | + if (false===$next_close=strpos($string,']',$offset)){ | |
1079 | + $next_close=$strlen+5; | |
1080 | + } | |
1081 | + } | |
1082 | + if ($next_close<$strlen){ | |
1083 | + // With Arg | |
1084 | + if ($next_equal<$next_close){ | |
1085 | + $tag=substr($string,$offset+1,$next_equal-$offset-1); | |
1086 | + if (false!==($tagId=$this->get_tag_id($tag,true))){ | |
1087 | + $argument=false; | |
1088 | + if ($this->quote_styles>0){ | |
1089 | + $end_quote=''; | |
1090 | + $end=$next_close; | |
1091 | + if ($quote_single && $string[$next_equal+1]=="'"){ | |
1092 | + $end_quote="'"; | |
1093 | + } elseif ($quote_double && $string[$next_equal+1]=='"') { | |
1094 | + $end_quote='"'; | |
1095 | + } | |
1096 | + if ($end_quote==''){ | |
1097 | + $argument=substr($string,$next_equal+1,$next_close-$next_equal-1); | |
1098 | + } else { | |
1099 | + if (false!==$end=strpos($string,"$end_quote]",$next_equal+1)){ | |
1100 | + $argument=substr($string,$next_equal+2,$end++ - $next_equal - 2); | |
1101 | + } else { | |
1102 | + $end=$strlen+5; | |
1103 | + } | |
1104 | + } | |
1105 | + } else { | |
1106 | + $argument=substr($string,$next_equal+1,$next_close-$next_equal-1); | |
1107 | + } | |
1108 | + if ($argument!==false){ | |
1109 | + $this->add_child(substr($string,$offset,$end-$offset+1),$tagId,$argument); | |
1110 | + $added=true; | |
1111 | + } | |
1112 | + } else { | |
1113 | + $end=$next_close; | |
1114 | + } | |
1115 | + } else { | |
1116 | + // Without Args | |
1117 | + $tag=substr($string,$offset+1,$next_close-$offset-1); | |
1118 | + $end=$next_close; | |
1119 | + if (false!==($tagId=$this->get_tag_id($tag,false))){ | |
1120 | + $this->add_child(substr($string,$offset,$end-$offset+1),$tagId); | |
1121 | + $added=true; | |
1122 | + } | |
1123 | + } | |
1124 | + } | |
1125 | + } else { | |
1126 | + if ($next_close<=$offset){ | |
1127 | + if (false===($next_close=strpos($string,']',$offset))){; | |
1128 | + $next_close=$strlen+5; | |
1129 | + } | |
1130 | + } | |
1131 | + //Close | |
1132 | + $tag=substr($string,$offset+2,$next_close-$offset-2); | |
1133 | + $end=$next_close; | |
1134 | + if (false!==($tagId=$this->get_tag_id($tag))){ | |
1135 | + $this->close_tag($tagId,substr($string,$offset,$end-$offset+1)); | |
1136 | + $added=true; | |
1137 | + } | |
1138 | + } | |
1139 | + } | |
1140 | + if (!$added){ | |
1141 | + $end=strpos($string,'[',$offset+1); | |
1142 | + if ($end==false){ | |
1143 | + $end=$strlen; | |
1144 | + } else { | |
1145 | + --$end; | |
1146 | + } | |
1147 | + $this->add_child(substr($string,$offset,$end-$offset+1)); | |
1148 | + } | |
1149 | + $offset=$end+1; | |
1150 | + } while($offset<$strlen); | |
1151 | + } | |
1152 | + | |
1153 | + /** | |
1154 | + * Adds a child to the tree | |
1155 | + * | |
1156 | + * @param string $string | |
1157 | + * @param int $tagId | |
1158 | + * @param string $argument | |
1159 | + */ | |
1160 | + private function add_child($string,$tagId=null,$argument=null){ | |
1161 | + if ($tagId===null){ | |
1162 | + // Only a textNode => Adding to childs | |
1163 | + $this->currentNode['c'][]=$string; | |
1164 | + } else { | |
1165 | + $tag=$this->tagListCache[$tagId]; | |
1166 | + // Auto Closing some elements | |
1167 | + if ($tag[4]&BBCode::FLAGS_ONE_OPEN_PER_LEVEL){ | |
1168 | + //Fixme Multiple parents cases | |
1169 | + $index=array_reverse($this->stackIndex); | |
1170 | + array_unshift($index,$this->currentNode['i']); | |
1171 | + $parent_pos=PHP_INT_MAX; | |
1172 | + foreach($tag[5] as $poss_parent){ | |
1173 | + $parent_pos=min(array_search($poss_parent,$index),$parent_pos); | |
1174 | + } | |
1175 | + if (false!==($last_el_pos=array_search($tagId,$index))){ | |
1176 | + if ($parent_pos<$last_el_pos){ | |
1177 | + // Return to parent | |
1178 | + for($i=0;$i<$parent_pos;++$i){ | |
1179 | + $this->close_tag($index[$i],'',false); | |
1180 | + } | |
1181 | + } else { | |
1182 | + // Close last element | |
1183 | + $this->close_tag($tagId,''); | |
1184 | + } | |
1185 | + } | |
1186 | + } | |
1187 | + // Creating Node | |
1188 | + $new_node=array('i'=>$tagId,'c'=>array(),'s'=>$string,'a'=>$argument===null?'':$argument,'p'=>false); | |
1189 | + $this->currentNode['c'][] =& $new_node; | |
1190 | + $this->stack[] =& $this->currentNode; | |
1191 | + $this->currentNode =& $new_node; | |
1192 | + $this->stackIndex[]=$tagId; | |
1193 | + if ($tag[0]==BBCode::TYPE_SINGLE){ | |
1194 | + $this->close_tag($tagId,''); | |
1195 | + } | |
1196 | + } | |
1197 | + } | |
1198 | + | |
1199 | + /** | |
1200 | + * Closes a tag | |
1201 | + * | |
1202 | + * @param int $tag_id | |
1203 | + * @param string $string | |
1204 | + * @param boolean $true_close | |
1205 | + */ | |
1206 | + private function close_tag($tag_id, $string,$true_close=true){ | |
1207 | + if (in_array($tag_id,$this->toCloseIndex)){ | |
1208 | + $closeIndex = array_search($tag_id, $this->toCloseIndex); | |
1209 | + $this->toClose[$closeIndex]['p']=true; | |
1210 | + array_splice($this->toClose,$closeIndex,1); | |
1211 | + array_splice($this->toCloseIndex,$closeIndex,1); | |
1212 | + } elseif (in_array($tag_id,$this->stackIndex)){ | |
1213 | + // Tag Open | |
1214 | + $searching=true; | |
1215 | + $conds=array(); | |
1216 | + do{ | |
1217 | + if ($this->currentNode['i']==$tag_id){ | |
1218 | + $searching=false; | |
1219 | + // Mark this node as paired (we found close tag) | |
1220 | + $this->currentNode['p']=$true_close; | |
1221 | + $this->currentNode['cs']=$string; | |
1222 | + $this->currentNode['cond'] =& $conds; | |
1223 | + if (isset($this->currentNode['mp'])){ | |
1224 | + $this->currentNode['l']=true; | |
1225 | + } | |
1226 | + if (!$true_close){ | |
1227 | + $this->toClose[] =& $this->currentNode; | |
1228 | + } | |
1229 | + } else { | |
1230 | + if (!in_array($tag_id,$this->tagListCache[$this->currentNode['i']][6])){ | |
1231 | + $conds[] =& $this->currentNode; | |
1232 | + } | |
1233 | + $this->currentNode['cs']=''; | |
1234 | + if ($this->tagListCache[$this->currentNode['i']][4]&BBCode::FLAGS_ONE_OPEN_PER_LEVEL){ | |
1235 | + $this->currentNode['p'] = true; | |
1236 | + } else { | |
1237 | + $this->currentNode['p'] = false; | |
1238 | + $this->toClose[] =& $this->currentNode; | |
1239 | + $this->toCloseIndex[] = $this->currentNode['i']; | |
1240 | + } | |
1241 | + } | |
1242 | + array_pop($this->stackIndex); | |
1243 | + $this->currentNode =& $this->stack[count($this->stack)-1]; | |
1244 | + array_pop($this->stack); | |
1245 | + } while($searching); | |
1246 | + if ($this->correct_reopen_tags){ | |
1247 | + $new_node = array(); | |
1248 | + for($i=count($this->toClose)-1;$i>=0;--$i){ | |
1249 | + if (!isset($this->toClose[$i]['mp'])){ | |
1250 | + $this->toClose[$i]['d'] = false; | |
1251 | + $this->toClose[$i]['mp'] = array(& $this->toClose[$i]); | |
1252 | + } | |
1253 | + $new_node[$i] = array( | |
1254 | + 'i'=>$this->toClose[$i]['i'], | |
1255 | + 's'=>'', 'cs'=>'', | |
1256 | + 'p'=>& $this->toClose[$i]['p'], | |
1257 | + 'd'=>& $this->toClose[$i]['d'], | |
1258 | + 'mp'=>& $this->toClose[$i]['mp'], | |
1259 | + 'par'=>array() | |
1260 | + ); | |
1261 | + if (isset($this->toClose[$i]['a'])){ | |
1262 | + $new_node[$i]['a']=$this->toClose[$i]['a']; | |
1263 | + } | |
1264 | + $new_node[$i]['mp'][] =& $new_node; | |
1265 | + for ($j=$i-1;$j>=0;--$j){ | |
1266 | + $new_node[$i]['par'][] =& $this->toClose[$j]; | |
1267 | + } | |
1268 | + $this->currentNode['c'][] =& $new_node[$i]; | |
1269 | + $this->stack[] =& $this->currentNode; | |
1270 | + $this->currentNode =& $new_node[$i]; | |
1271 | + $this->stackIndex[] = $this->toClose[$i]['i']; | |
1272 | + } | |
1273 | + $this->toCloseIndex=$this->toClose=array(); | |
1274 | + } | |
1275 | + } else { | |
1276 | + // Tag Not Open | |
1277 | + $this->add_child($string); | |
1278 | + } | |
1279 | + } | |
1280 | + /** | |
1281 | + * Validates a tree and applying Childs / Parent Rules | |
1282 | + * | |
1283 | + * @param array $tree | |
1284 | + * @param int $parent | |
1285 | + * @param boolean $force_false | |
1286 | + * @return array | |
1287 | + */ | |
1288 | + private function correct_tree(&$tree=null,$parent=0,$force_false=false){ | |
1289 | + /* Getting all options localy to use local symbol table */ | |
1290 | + $restore_tree=false; | |
1291 | + /* Fetching tree if using object internal tree */ | |
1292 | + if (is_null($tree)){ | |
1293 | + $tree =& $this->tree; | |
1294 | + $restore_tree=true; | |
1295 | + } | |
1296 | + /* fetch auto_correct localy */ | |
1297 | + $ac=$this->auto_correct; | |
1298 | + /* Starting new tree for corrected version */ | |
1299 | + $new_tree=array(); | |
1300 | + /* fetch tag localy */ | |
1301 | + $tag=$this->tagListCache[$tree['i']]; | |
1302 | + /* Check if parent is in parent_allow_list */ | |
1303 | + if (!in_array($parent,$tag[5])){ | |
1304 | + $force_false=true; | |
1305 | + } | |
1306 | + if ($force_false){ | |
1307 | + /* if force_false is enabled, unpair tags */ | |
1308 | + $tree['p']=false; | |
1309 | + } elseif (isset($tree['i']) && $tag[4]&BBCode::FLAGS_ONE_OPEN_PER_LEVEL){ | |
1310 | + /* If this tag has the special flag ONE_OPEN_PER_LEVEL, force pairing */ | |
1311 | + $tree['p']=true; | |
1312 | + } | |
1313 | + if (!$ac && !$tree['p']){ | |
1314 | + /* If no auto_correction neither pairing, force false */ | |
1315 | + $force_false=true; | |
1316 | + } | |
1317 | + /* Fetch the parent, according to force_false setting */ | |
1318 | + $orig_parent=$parent; | |
1319 | + $parent=$force_false?$parent:$tree['i']; | |
1320 | + /* If some elements has some conditions over other elements */ | |
1321 | + if (isset($tree['cond'])){ | |
1322 | + /* searching trough conditions lists */ | |
1323 | + foreach ($tree['cond'] as $element){ | |
1324 | + if (!$element['p']){ | |
1325 | + continue; | |
1326 | + } else { | |
1327 | + /* If one condition is paired, this element can not exists */ | |
1328 | + $tree['p']=false; | |
1329 | + } | |
1330 | + } | |
1331 | + } | |
1332 | + /* Forcing child_list presence */ | |
1333 | + if (!isset($tree['c'])){ | |
1334 | + $tree['c']= array(); | |
1335 | + } | |
1336 | + /* Browsing child_list for corrections */ | |
1337 | + for($i=0; $i<count($tree['c']);++$i){ | |
1338 | + $child =& $tree['c'][$i]; | |
1339 | + /* Subtree */ | |
1340 | + if (is_array($child)){ | |
1341 | + /* If the child is a multipart and not done */ | |
1342 | + if (isset($child['mp']) && !$child['d']){ | |
1343 | + //Multipart Child | |
1344 | + foreach($child['mp'] as $child_part){ | |
1345 | + /* TODO Comments */ | |
1346 | + if (is_array($child_part)){ | |
1347 | + if (!isset($child_part['i'])){ | |
1348 | + continue; | |
1349 | + } | |
1350 | + /* If one child has parents and if one parent is unpaired mark as unpaired */ | |
1351 | + if (isset($child_part['par'])){ | |
1352 | + for($j=0;$j<count($child_part['par']);++$j){ | |
1353 | + if ($child_part['par'][$j]['p']){ | |
1354 | + continue; | |
1355 | + } | |
1356 | + $tree['p']=false; | |
1357 | + break; | |
1358 | + } | |
1359 | + } else { | |
1360 | + /* Check for mutual inclusion as child else, mark as unpaired */ | |
1361 | + /* TODO: Check if the original way was not parent / child checking */ | |
1362 | + if (in_array($child_part['i'],$this->tagListCache[$parent][6])){ | |
1363 | + if (in_array($parent,$this->tagListCache[$child_part['i']][6])){ | |
1364 | + continue; | |
1365 | + } | |
1366 | + } | |
1367 | + $tree['p']=false; | |
1368 | + break; | |
1369 | + } | |
1370 | + } | |
1371 | + } | |
1372 | + /* Mark Child as done */ | |
1373 | + $child['d']=true; | |
1374 | + /* If no autocorrection & unpaired */ | |
1375 | + if (!$ac && !$tree['p']){ | |
1376 | + /* Force False */ | |
1377 | + $force_false=true; | |
1378 | + } | |
1379 | + /* Get Parent for allow_list resolv */ | |
1380 | + $parent=$force_false?$orig_parent:$tree['i']; | |
1381 | + /* Checking allow_list */ | |
1382 | + if (in_array($child['i'], $this->tagListCache[$parent][6])){ | |
1383 | + /* The tag can be a subelement of this one */ | |
1384 | + $return =& $this->correct_tree($child, $parent, false); | |
1385 | + } else { | |
1386 | + /* The tag can not be a subelement of this one */ | |
1387 | + $return =& $this->correct_tree($child, $parent, true); | |
1388 | + } | |
1389 | + } elseif (in_array($child['i'], $this->tagListCache[$parent][6])){ | |
1390 | + /* The tag can be a subelement of this one */ | |
1391 | + $return =& $this->correct_tree($child, $parent, false); | |
1392 | + } else { | |
1393 | + /* The tag cannot be a subelement of this one */ | |
1394 | + $return =& $this->correct_tree($child, $parent, true); | |
1395 | + } | |
1396 | + /* Appending return(s) to new_tree */ | |
1397 | + array_splice($new_tree, count($new_tree), 0, $return); | |
1398 | + } else { | |
1399 | + /* String */ | |
1400 | + $new_tree[] =& $child; | |
1401 | + } | |
1402 | + } | |
1403 | + if (!$force_false && ($tree['p'] || $ac)){ | |
1404 | + /* If tree is correct or autocorrection is ON */ | |
1405 | + /* Replace Child List with corrected one */ | |
1406 | + $tree['c'] =& $new_tree; | |
1407 | + // Multipart_Join | |
1408 | + /* Return data */ | |
1409 | + if ($restore_tree){ | |
1410 | + $tree['c'] =& $new_tree; | |
1411 | + } else { | |
1412 | + return array(&$tree); | |
1413 | + } | |
1414 | + } else { | |
1415 | + /* If force false or no autocorrection and unpaired tag */ | |
1416 | + if ($force_false){ | |
1417 | + /* If force false flag is set, force unpair */ | |
1418 | + $tree['p']=false; | |
1419 | + } | |
1420 | + /* prepend the current open String to corrected Child_list */ | |
1421 | + array_unshift($new_tree,$tree['s']); | |
1422 | + /* append the closing string to corrected child list */ | |
1423 | + $new_tree[] =& $tree['cs']; | |
1424 | + /* Return data */ | |
1425 | + if ($restore_tree){ | |
1426 | + $this->tree =& $new_tree; | |
1427 | + } else { | |
1428 | + return $new_tree; | |
1429 | + } | |
1430 | + } | |
1431 | + } | |
1432 | + /** | |
1433 | + * Apply the ruleset to transform BBCode tree to Markup | |
1434 | + * | |
1435 | + * @param array $tree | |
1436 | + * @return string | |
1437 | + */ | |
1438 | + private function apply_rules($tree){ | |
1439 | + //Fetch datas locally - Performance | |
1440 | + $default_smileys=$this->default_smileys; | |
1441 | + $auto_correct=$this->auto_correct; | |
1442 | + $string=""; | |
1443 | + $tag=array(); | |
1444 | + if (isset($tree['i'])){ | |
1445 | + $tag=$this->tagListCache[$tree['i']]; | |
1446 | + } | |
1447 | + $last_string=''; | |
1448 | + for ($i=0;$i<count($tree['c']);++$i){ | |
1449 | + if (is_array($tree['c'][$i]) && isset($tree['c'][$i]['mp'])){ | |
1450 | + for($j=$i+1;$j<count($tree['c']);++$j){ | |
1451 | + if (is_array($tree['c'][$j]) && isset($tree['c'][$j]['mp'])){ | |
1452 | + $tree['c'][$j]['mp'][0]['ref_test_key']='TEST'; | |
1453 | + if (isset($tree['c'][$i]['mp'][0]['ref_test_key'])){ | |
1454 | + for ($k=$i+1;$k<$j;++$k){ | |
1455 | + $tree['c'][$i]['c'][] =& $tree['c'][$k]; | |
1456 | + } | |
1457 | + for ($k=0;$k<count($tree['c'][$j]['c']);++$k){ | |
1458 | + $tree['c'][$i]['c'][] =& $tree['c'][$j]['c'][$k]; | |
1459 | + } | |
1460 | + $tree['c'][$i]['cs']=$tree['c'][$j]['cs']; | |
1461 | + unset($tree['c'][$j]['mp'][0]['ref_test_key']); | |
1462 | + array_splice($tree['c'],$i+1,$j-$i); | |
1463 | + $i=0; | |
1464 | + continue 2; | |
1465 | + } else { | |
1466 | + unset($tree['c'][$j]['mp'][0]['ref_test_key']); | |
1467 | + break; | |
1468 | + } | |
1469 | + } | |
1470 | + } | |
1471 | + } | |
1472 | + } | |
1473 | + foreach($tree['c'] as $child){ | |
1474 | + if (is_array($child)){ | |
1475 | + //Make a one block treatment for smileys | |
1476 | + if (strlen($last_string)){ | |
1477 | + if (!$this->force_smileys_off && $tag[15]){ | |
1478 | + $string.=$this->smileys($last_string); | |
1479 | + } else { | |
1480 | + $string.=$last_string; | |
1481 | + } | |
1482 | + } | |
1483 | + $string.=$this->apply_rules($child); | |
1484 | + $last_string=''; | |
1485 | + } else { | |
1486 | + //Concat String for Smiley treatment | |
1487 | + $last_string.=$child; | |
1488 | + } | |
1489 | + } | |
1490 | + //Make a one block treatment for smileys | |
1491 | + if (strlen($last_string)){ | |
1492 | + if (!$this->force_smileys_off && $tag[15]){ | |
1493 | + $string.=$this->smileys($last_string); | |
1494 | + } else { | |
1495 | + $string.=$last_string; | |
1496 | + } | |
1497 | + } | |
1498 | + if (!($auto_correct || $tree['p'] || ($tag[4]&BBCode::FLAGS_ONE_OPEN_PER_LEVEL))){ | |
1499 | + return ($tree['s']).$string; | |
1500 | + } else { | |
1501 | + $start=$tag[1]; | |
1502 | + $end=$tag[2]; | |
1503 | + | |
1504 | + $arg=''; | |
1505 | + if ($tag[11]){ | |
1506 | + if ($tree['a']!=''){ | |
1507 | + $arg=$tree['a']; | |
1508 | + } else { | |
1509 | + $arg=$tag[3]; | |
1510 | + } | |
1511 | + if ($tag[4] & BBCode::FLAGS_ARG_PARSING){ | |
1512 | + if ($this->arg_parser!==null){ | |
1513 | + $arg=$this->arg_parser->parse($arg); | |
1514 | + } else { | |
1515 | + $arg=$this->parse($arg); | |
1516 | + } | |
1517 | + } | |
1518 | + } | |
1519 | + /* Search For CallBacks */ | |
1520 | + if ($cb=$this->get_callback($tree['i'],true)){ | |
1521 | + $arg=$cb($string,$arg); | |
1522 | + } | |
1523 | + if ($cb=$this->get_callback($tree['i'],false)){ | |
1524 | + $string=$cb($string,$arg); | |
1525 | + } | |
1526 | + /* Replacing {ARG} by $arg and {CONTENT} by $string in arg & start */ | |
1527 | + $arg =str_replace("{CONTENT}",$string,$arg); | |
1528 | + if ($tag[13]){ | |
1529 | + $start=str_replace("{CONTENT}",$string,$start); | |
1530 | + $start=str_replace("{ARG}",$arg,$start); | |
1531 | + } | |
1532 | + | |
1533 | + /* Replacing {ARG} by $arg in string & end */ | |
1534 | + $string =str_replace("{ARG}",$arg,$string); | |
1535 | + if ($tag[14]){ | |
1536 | + $end=str_replace("{ARG}",$arg,$end); | |
1537 | + } | |
1538 | + | |
1539 | + return $start.$string.$end; | |
1540 | + } | |
1541 | + } | |
1542 | + /** | |
1543 | + * Returns a callback for a tag_id | |
1544 | + * | |
1545 | + * @param int $tagid | |
1546 | + * @param bolean $is_arg | |
1547 | + * @return callback | |
1548 | + */ | |
1549 | + private function get_callback($tagid,$is_arg){ | |
1550 | + $tag = $this->tagListCache[$tagid]; | |
1551 | + if ($is_arg){ | |
1552 | + if ($tag[10]===null){ | |
1553 | + $this->tagListCache[$tagid][10]=is_callable($tag[9])?$tag[9]:false; | |
1554 | + } | |
1555 | + return $this->tagListCache[$tagid][10]; | |
1556 | + } else { | |
1557 | + if ($tag[8]===null){ | |
1558 | + $this->tagListCache[$tagid][8]=is_callable($tag[7])?$tag[7]:false; | |
1559 | + } | |
1560 | + return $this->tagListCache[$tagid][8]; | |
1561 | + } | |
1562 | + } | |
1563 | + /** | |
1564 | + * Treats smileys | |
1565 | + * | |
1566 | + * @param string $smileys | |
1567 | + * @return string | |
1568 | + */ | |
1569 | + private function smileys($string){ | |
1570 | + $keys=array_keys($this->smileys); | |
1571 | + return str_replace($keys,$this->smileys,$string); | |
1572 | + } | |
1573 | + /** | |
1574 | + * Returns a tag_id from his name (tag_id is internal) | |
1575 | + * | |
1576 | + * @param string $tag_name | |
1577 | + * @param boolean $has_args | |
1578 | + * @return string | |
1579 | + */ | |
1580 | + private function get_tag_id($tag_name, $has_arg=null){ | |
1581 | + $tag_name=strtolower($tag_name); | |
1582 | + if (isset($this->tagListIndex[$tag_name])){ | |
1583 | + $tag_id=$this->tagListIndex[$tag_name]; | |
1584 | + if ($has_arg===null){ | |
1585 | + return $tag_id; | |
1586 | + } elseif ($has_arg===false){ | |
1587 | + if ($this->tagListCache[$tag_id][12]===true){ | |
1588 | + return $tag_id; | |
1589 | + } | |
1590 | + } else { | |
1591 | + if ($this->tagListCache[$tag_id][11]===true){ | |
1592 | + return $tag_id; | |
1593 | + } | |
1594 | + } | |
1595 | + } | |
1596 | + return false; | |
1597 | + } | |
1598 | +} | |
1599 | +$arrayBBCode=array( | |
1600 | +''=> array('open_tag'=>'', 'close_tag'=>'', 'type'=>BBCode::TYPE_ROOT), | |
1601 | +'b'=> array('type'=>BBCode::TYPE_NOARG, 'childs'=>'all', 'open_tag'=>'<b>', 'close_tag'=>'</b>'), | |
1602 | +'u'=> array('type'=>BBCode::TYPE_NOARG, 'childs'=>'all', 'smileys'=>false, 'open_tag'=>'<u>', 'close_tag'=>'</u>'), | |
1603 | +'i'=> array('type'=>BBCode::TYPE_NOARG, 'childs'=>'all', 'open_tag'=>'<i>', 'close_tag'=>'</i>'), | |
1604 | +'code'=> array('type'=>BBCode::TYPE_NOARG, 'childs'=>'u', 'open_tag'=>'<code>', 'close_tag'=>'</code>'), | |
1605 | +'m'=> array('type'=>BBCode::TYPE_NOARG, 'open_tag'=>'<a href="/maraboutage.php">', 'close_tag'=>'</a>'), | |
1606 | +'cap'=> array('type'=>BBCode::TYPE_NOARG, 'open_tag'=>'<span style="text-transform:capitalize;">', 'close_tag'=>'</span>'), | |
1607 | +'mini'=> array('type'=>BBCode::TYPE_NOARG, 'open_tag'=>'<span class="mini">', 'close_tag'=>'</span>'), | |
1608 | +'right'=> array('type'=>BBCode::TYPE_NOARG, 'open_tag'=>'<div style="text-align:right;">', 'close_tag'=>'</div>'), | |
1609 | +'center'=> array('type'=>BBCode::TYPE_NOARG, 'open_tag'=>'<div style="text-align:center;">', 'close_tag'=>'</div>'), | |
1610 | +'just'=> array('type'=>BBCode::TYPE_NOARG, 'open_tag'=>'<div style="text-align:justify;width:450px;margin:0 auto;">', 'close_tag'=>'</div>'), | |
1611 | +'strike'=> array('type'=>BBCode::TYPE_NOARG, 'open_tag'=>'<span style="text-decoration:line-through;">', 'close_tag'=>'</span>'), | |
1612 | +'ancre'=> array('type'=>BBCode::TYPE_NOARG, 'open_tag'=>'<a name="', 'close_tag'=>'"> </a>'), | |
1613 | +'moumou'=> array('type'=>BBCode::TYPE_NOARG, 'open_tag'=>'<img src="', 'close_tag'=>'" />'), | |
1614 | +'round'=> array('type'=>BBCode::TYPE_NOARG, 'open_tag'=>'<div style="border:2px double white;border-radius: 8px; padding:6px; -moz-border-radius: 8px; background-color:#000; color:#FFF;">', 'close_tag'=>'</div>'), | |
1615 | +'hide'=> array('type'=>BBCode::TYPE_NOARG, 'open_tag'=>'', 'close_tag'=>'', 'content_handling'=>'BBVoid'), | |
1616 | +'np'=> array('type'=>BBCode::TYPE_NOARG, 'open_tag'=>'', 'close_tag'=>''), | |
1617 | +'quote'=> array('type'=>BBCode::TYPE_OPTARG, 'flags'=>BBCode::FLAGS_ARG_PARSING , 'open_tag'=>'<fieldset><legend>{ARG}</legend>', 'close_tag'=>'</fieldset>', 'default_arg'=>'Citation'), | |
1618 | +'id'=> array('type'=>BBCode::TYPE_OPTARG, 'arg_parse'=>false, 'open_tag'=>'', 'close_tag'=>'', 'default_arg'=>'{SELF}', 'content_handling'=>'BBId2User'), | |
1619 | +'msg'=> array('type'=>BBCode::TYPE_OPTARG, 'arg_parse'=>false, 'open_tag'=>'', 'close_tag'=>'', 'default_arg'=>'{SELF}', 'content_handling'=>'BBId2Msg'), | |
1620 | +'url'=> array('type'=>BBCode::TYPE_OPTARG, 'arg_parse'=>false, 'open_tag'=>'<a href="{ARG}">', 'close_tag'=>'</a>', 'default_arg'=>'{CONTENT}', 'arg_handling'=>'validate_url'), | |
1621 | +'img'=> array('type'=>BBCode::TYPE_OPTARG, 'arg_parse'=>false, 'open_tag'=>'<img src="{ARG}" alt="', 'close_tag'=>'" />', 'default_arg'=>'{CONTENT}'), | |
1622 | +'mail'=> array('type'=>BBCode::TYPE_OPTARG, 'arg_parse'=>false, 'open_tag'=>'<a href="mailto:{ARG}">', 'close_tag'=>'</a>', 'default_arg'=>'{CONTENT}'), | |
1623 | +'border'=> array('type'=>BBCode::TYPE_OPTARG, 'arg_parse'=>false, 'open_tag'=>'<div style="border:{ARG}px solid;">', 'close_tag'=>'</div>', 'default_arg'=>'5'), | |
1624 | +'list'=> array('type'=>BBCode::TYPE_OPTARG, 'arg_parse'=>false, 'open_tag'=>'<ol type="{ARG}">', 'close_tag'=>'</ol>', 'default_arg'=>'1', 'content_handling'=>'BBlist'), | |
1625 | +'*' => array('type'=>BBCode::TYPE_NOARG, 'flags'=>BBCode::FLAGS_ONE_OPEN_PER_LEVEL,'parents'=>'list', 'open_tag'=>'<li>', 'close_tag'=>'</li>',), | |
1626 | +'col'=> array('type'=>BBCode::TYPE_OPTARG, 'arg_parse'=>false, 'open_tag'=>'<div style="-moz-column-count:{ARG}; text-align:justify;-moz-column-gap:8px;">', 'close_tag'=>'</div>', 'default_arg'=>'2'), | |
1627 | +'hexdump'=> array('type'=>BBCode::TYPE_OPTARG, 'arg_parse'=>false, 'open_tag'=>'[Hex Dump]<br />', 'close_tag'=>'', 'default_arg'=>'0x345622', 'content_handling'=>'BBHexDump'), | |
1628 | +'bcktrc'=> array('type'=>BBCode::TYPE_OPTARG, 'arg_parse'=>false, 'open_tag'=>'', 'close_tag'=>'', 'default_arg'=>'0x345622', 'content_handling'=>'BBBackTrace'), | |
1629 | +'bong'=> array('type'=>BBCode::TYPE_OPTARG, 'arg_parse'=>false, 'open_tag'=>'<div id="{ARG}">', 'close_tag'=>'</div><script type="text/javascript">new OngletsBlock(\'{ARG}\');</script>','default_arg'=>'Fiche'), | |
1630 | +'onglet'=> array('type'=>BBCode::TYPE_ARG, 'arg_parse'=>false, 'open_tag'=>'<h4>{ARG}</h4><div title="{ARG}" closable="true" style="clear:both;">','close_tag'=>'</div>','default_arg'=>'Default'), | |
1631 | +'color'=> array('type'=>BBCode::TYPE_ARG, 'arg_parse'=>false, 'open_tag'=>'<span style="color:{ARG}">', 'close_tag'=>'</span>'), | |
1632 | +'size'=> array('type'=>BBCode::TYPE_ARG, 'arg_parse'=>false, 'open_tag'=>'<span style="font-size:{ARG}px;">', 'close_tag'=>'</span>'), | |
1633 | +'goto'=> array('type'=>BBCode::TYPE_ARG, 'arg_parse'=>false, 'open_tag'=>'<a href="#{ARG}" onmouseover="this.href=document.location.href.replace(/#.*/img ,\'\')+\'#{ARG}\'">', 'close_tag'=>'</a>'), | |
1634 | +'fade'=> array('type'=>BBCode::TYPE_ARG, 'arg_parse'=>false, 'open_tag'=>'', 'close_tag'=>'', 'content_handling'=>'BBDegrade'), | |
1635 | +'wave'=> array('type'=>BBCode::TYPE_ARG, 'arg_parse'=>false, 'open_tag'=>'', 'close_tag'=>'', 'content_handling'=>'BBWave'), | |
1636 | +'barre'=> array('type'=>BBCode::TYPE_SINGLE, 'open_tag'=>'<hr />'), | |
1637 | +); | |
1638 | +$bbcode=new BBCode($arrayBBCode,array(':)'=>'\\o/',':|'=>'/o\\')); | |
1639 | +$bbcode->auto_correct=false; | |
1640 | +$bbcode->correct_reopen_tags=true; | |
1641 | +$time=microtime(true); | |
1642 | +$string=<<<EOF | |
1643 | +[list][*]List[list][*]SubList[/list][/list] | |
1644 | +EOF; | |
1645 | +echo $bbcode->parse($string)."\n"; | |
1646 | +$val[]=microtime(true)-$time; | |
1647 | +echo (microtime(true)-$time)."\n"; | |
1648 | +$time=microtime(true); | |
1649 | +$string=<<<EOF | |
1650 | +UUU[quote="[u]:) :|UUU[/u]"][b]:)Te[b]st[/b][/quote]AAAAA | |
1651 | +[LIST=0][*]Test | |
1652 | +TEst | |
1653 | +[*][list=a][*]Coucou | |
1654 | +[/list] | |
1655 | +[/list] | |
1656 | +EOF; | |
1657 | +echo $bbcode->parse($string)."\n"; | |
1658 | +$val[]=microtime(true)-$time; | |
1659 | +echo (microtime(true)-$time)."\n"; | |
1660 | +$time=microtime(true); | |
1661 | +$string=<<<EOF | |
1662 | +[b][u]Hello[/b] W[i]o[b]r [b]ld[/u] Coucou[/i] Vro[/b] Vroum | |
1663 | +EOF; | |
1664 | +echo $bbcode->parse($string)."\n"; | |
1665 | +$val[]=microtime(true)-$time; | |
1666 | +echo (microtime(true)-$time)."\n"; | |
1667 | +$time=microtime(true); | |
1668 | +$string=<<<EOF | |
1669 | +[list][*]List[list][*]SubList[*]element2[list][*]SubSubList[/list][/list][*]element 3[/list] | |
1670 | +EOF; | |
1671 | +echo $bbcode->parse($string)."\n"; | |
1672 | +$val[]=microtime(true)-$time; | |
1673 | +echo (microtime(true)-$time)."\n"; | |
1674 | +$time=microtime(true); | |
1675 | +$string=<<<EOF | |
1676 | +[list][*]List[list][*]SubList[/list][/list] | |
1677 | +EOF; | |
1678 | +echo $bbcode->parse($string)."\n"; | |
1679 | +$val[]=microtime(true)-$time; | |
1680 | +echo (microtime(true)-$time)."\n"; | |
1681 | +$time=microtime(true); | |
1682 | +$string=<<<EOF | |
1683 | +[b]Test[u]Test[b] [i] Glup [u] [*][*][barre][i]Glop[/i] [/u][/i]Zop[/b] [/u][/b] | |
1684 | +EOF; | |
1685 | +echo $bbcode->parse($string)."\n"; | |
1686 | +$val[]=microtime(true)-$time; | |
1687 | +echo (microtime(true)-$time)."\n"; | |
1688 | +$time=microtime(true); | |
1689 | +//$bbcode->noTreeBuild=true; | |
1690 | +$bbcode->default_smileys=true; | |
1691 | +$string=<<<EOF | |
1692 | +[b][i] [code] [u][/i][/b][b][/u] [/code] [u] Test [/b][/u] | |
1693 | +EOF; | |
1694 | +echo $bbcode->parse($string)."\n"; | |
1695 | +$val[]=microtime(true)-$time; | |
1696 | +echo (microtime(true)-$time)."\n"; | |
1697 | +echo array_sum($val); | |
1698 | \ No newline at end of file | |
1699 | ||
1700 | Property changes on: bbcode.php | |
1701 | ___________________________________________________________________ | |
1702 | Added: svn:eol-style | |
1703 | + native | |
1704 | Added: svn:keywords | |
1705 | + Id Rev Revision Date LastChangedDate LastChangedRevision Author LastChangedBy HeadURL URL | |
1706 | Added: cvs2svn:cvs-rev | |
1707 | + 1.4 | |
1708 | ||
1709 | Index: config.m4 | |
1710 | =================================================================== | |
1711 | --- config.m4 (.../tags/RELEASE_1_0_2) | |
1712 | +++ config.m4 (.../trunk) | |
1713 | @@ -7,7 +7,7 @@ | |
1714 | ||
1715 | if test "$PHP_BBCODE" = "yes"; then | |
1716 | AC_DEFINE(HAVE_BBCODE,1,[Whether you want BBCode support]) | |
1717 | + PHP_NEW_EXTENSION(bbcode, php_bbcode.c lib/bstrlib.c lib/bbcode2.c, $ext_shared,, "-I@ext_srcdir@/lib") | |
1718 | PHP_ADD_BUILD_DIR(lib) | |
1719 | - PHP_NEW_EXTENSION(bbcode, php_bbcode.c lib/bstrlib.c lib/bbcode2.c, $ext_shared, , "-I@ext_srcdir@/lib") | |
1720 | fi | |
1721 | ||
1722 | ||
1723 | Property changes on: config.m4 | |
1724 | ___________________________________________________________________ | |
1725 | Modified: cvs2svn:cvs-rev | |
1726 | - 1.4 | |
1727 | + 1.5 | |
1728 | ||
1729 | Index: lib/bbcode2.c | |
1730 | =================================================================== | |
1731 | --- lib/bbcode2.c (.../tags/RELEASE_1_0_2) | |
1732 | +++ lib/bbcode2.c (.../trunk) | |
1733 | @@ -95,6 +95,8 @@ | |
1734 | /* Parse a BBCoded string to is treated equivalent */ | |
1735 | char *bbcode_parse(bbcode_parser_p parser, char *string, int string_size, | |
1736 | int *result_size) { | |
1737 | + char *return_value; | |
1738 | + | |
1739 | bstring to_parse = NULL; | |
1740 | bstring parsed = NULL; | |
1741 | to_parse=bfromcstr(""); | |
1742 | @@ -103,9 +105,10 @@ | |
1743 | if (parser->options & BBCODE_DISABLE_TREE_BUILD) { | |
1744 | /* No BBCode Parsing */ | |
1745 | if (parser->options & BBCODE_FORCE_SMILEYS_OFF) { | |
1746 | + char *return_value=(char *)malloc(string_size * sizeof(char)); | |
1747 | + | |
1748 | /* No Smiley Treatment */ | |
1749 | *result_size=string_size; | |
1750 | - char *return_value=(char *)malloc(string_size * sizeof(char)); | |
1751 | return memcpy(return_value, string, string_size); | |
1752 | } | |
1753 | /* Prepare Datas for smiley */ | |
1754 | @@ -115,12 +118,14 @@ | |
1755 | /* Smiley Parsing */ | |
1756 | bbcode_parse_smileys(to_parse, parser->smileys); | |
1757 | } else { | |
1758 | + /* starting the tree */ | |
1759 | + bbcode_parse_tree_p tree = bbcode_tree_create(); | |
1760 | + | |
1761 | /* Prepare Datas for parsing */ | |
1762 | balloc(to_parse, string_size+5); | |
1763 | to_parse->slen=string_size; | |
1764 | memcpy(to_parse->data, string, string_size); | |
1765 | - /* starting the tree */ | |
1766 | - bbcode_parse_tree_p tree = bbcode_tree_create(); | |
1767 | + | |
1768 | /* Preparing tag_list if needed */ | |
1769 | bbcode_prepare_tag_list(parser); | |
1770 | /* Build the BBCode Tree from the string */ | |
1771 | @@ -136,7 +141,7 @@ | |
1772 | } | |
1773 | /* Getting the return string */ | |
1774 | *result_size=to_parse->slen; | |
1775 | - char *return_value=(char *)malloc(*result_size * sizeof(char)+1); | |
1776 | + return_value=(char *)malloc(*result_size * sizeof(char)+1); | |
1777 | return_value=memcpy(return_value, to_parse->data, to_parse->slen+1); | |
1778 | bdestroy(to_parse); | |
1779 | bdestroy(parsed); | |
1780 | @@ -173,6 +178,8 @@ | |
1781 | struct bstrList *bsplited; | |
1782 | char accept_smileys; | |
1783 | char default_smileys; | |
1784 | + int i, j, max; | |
1785 | + | |
1786 | accept_smileys=1; | |
1787 | if (parser->options & BBCODE_FORCE_SMILEYS_OFF) { | |
1788 | accept_smileys=0; | |
1789 | @@ -181,7 +188,7 @@ | |
1790 | if (parser->options & BBCODE_DEFAULT_SMILEYS_ON) { | |
1791 | default_smileys=1; | |
1792 | } | |
1793 | - int i, j, max; | |
1794 | + | |
1795 | max=0; | |
1796 | list=parser->bbcodes; | |
1797 | /* Resolve cache preparation */ | |
1798 | @@ -211,8 +218,11 @@ | |
1799 | list->search_cache[i]=NULL; | |
1800 | } | |
1801 | for (i=0; i<bbcode_array_length(list->bbcodes); i++) { | |
1802 | + int slen; | |
1803 | + bbcode_search temp; | |
1804 | + | |
1805 | bbcode=bbcode_get_bbcode(parser, i); | |
1806 | - int slen=blength(bbcode->tag); | |
1807 | + slen=blength(bbcode->tag); | |
1808 | if (list->search_cache[slen]==NULL) { | |
1809 | list->search_cache[slen] | |
1810 | =(bbcode_search_p) malloc(sizeof(bbcode_search)); | |
1811 | @@ -220,7 +230,7 @@ | |
1812 | list->search_cache[slen]=(bbcode_search_p) realloc( | |
1813 | list->search_cache[slen], sizeof(bbcode_search) * (list->num_cache[slen]+1)); | |
1814 | } | |
1815 | - bbcode_search temp; | |
1816 | + | |
1817 | temp.tag_name=bbcode->tag; | |
1818 | temp.tag_id=i; | |
1819 | list->search_cache[slen][list->num_cache[slen]]=temp; | |
1820 | @@ -239,6 +249,7 @@ | |
1821 | /* All Accepted */ | |
1822 | list->root->childs->type=BBCODE_ALLOW_LIST_TYPE_ALL; | |
1823 | } else { | |
1824 | + long find; | |
1825 | bstring work = bstrcpy(list->root->child_list); | |
1826 | if ((bchar(list->root->child_list, 0) == '!') == 1) { | |
1827 | list->root->childs->type=BBCODE_ALLOW_LIST_TYPE_EXCLUDE; | |
1828 | @@ -249,7 +260,7 @@ | |
1829 | } | |
1830 | /* We add all entries */ | |
1831 | bsplited=bsplit (work, ','); | |
1832 | - long find; | |
1833 | + | |
1834 | bbcode_allow_list_check_size(list->root->childs, bsplited->qty); | |
1835 | for (j=0; j<bsplited->qty; j++) { | |
1836 | find = bbcode_get_tag_id (parser, bsplited->entry[j], -1); | |
1837 | @@ -294,6 +305,8 @@ | |
1838 | /* All Accepted */ | |
1839 | bbcode->parents->type=BBCODE_ALLOW_LIST_TYPE_ALL; | |
1840 | } else { | |
1841 | + long find; | |
1842 | + | |
1843 | bstring work = bstrcpy(bbcode->parent_list); | |
1844 | if (bchar(bbcode->parent_list, 0) == '!') { | |
1845 | bbcode->parents->type=BBCODE_ALLOW_LIST_TYPE_EXCLUDE; | |
1846 | @@ -303,7 +316,7 @@ | |
1847 | } | |
1848 | /* We add all entries */ | |
1849 | bsplited=bsplit (work, ','); | |
1850 | - long find; | |
1851 | + | |
1852 | bbcode_allow_list_check_size(bbcode->parents, bsplited->qty); | |
1853 | for (j=0; j<bsplited->qty; j++) { | |
1854 | find = bbcode_get_tag_id (parser, bsplited->entry[j], -1); | |
1855 | @@ -324,6 +337,8 @@ | |
1856 | /* All Accepted */ | |
1857 | bbcode->childs->type=BBCODE_ALLOW_LIST_TYPE_ALL; | |
1858 | } else { | |
1859 | + long find; | |
1860 | + | |
1861 | bstring work=bstrcpy(bbcode->child_list); | |
1862 | if (bchar(bbcode->child_list, 0) == '!') { | |
1863 | bbcode->childs->type=BBCODE_ALLOW_LIST_TYPE_EXCLUDE; | |
1864 | @@ -333,7 +348,7 @@ | |
1865 | } | |
1866 | /* We add all entries */ | |
1867 | bsplited=bsplit (work, ','); | |
1868 | - long find; | |
1869 | + | |
1870 | bbcode_allow_list_check_size(bbcode->childs, bsplited->qty); | |
1871 | for (j=0; j<bsplited->qty; j++) { | |
1872 | find = bbcode_get_tag_id (parser, bsplited->entry[j], -1); | |
1873 | @@ -367,6 +382,8 @@ | |
1874 | int offset, end, next_equal, next_close, string_length; | |
1875 | long tag_id; | |
1876 | int quote_enabled=(quote_double || quote_single || quote_html); | |
1877 | + bbcode_parse_tree_array_p work_stack = NULL, close_stack = NULL; | |
1878 | + | |
1879 | string_length=blength(string); | |
1880 | tag_id=end=next_equal=next_close=0; | |
1881 | end_double=bfromcstr("\"]"); | |
1882 | @@ -376,7 +393,6 @@ | |
1883 | /* END INIT */ | |
1884 | offset=bstrchr(string, '['); | |
1885 | bbcode_tree_push_string_child(tree, bmidstr(string, 0, offset), offset); | |
1886 | - bbcode_parse_tree_array_p work_stack = NULL, close_stack = NULL; | |
1887 | work_stack=bbcode_parse_stack_create(); | |
1888 | bbcode_parse_stack_push_element(work_stack,tree); | |
1889 | close_stack=bbcode_parse_stack_create(); | |
1890 | @@ -398,9 +414,11 @@ | |
1891 | 1))) { | |
1892 | /* Quotes */ | |
1893 | if (quote_enabled) { | |
1894 | + int diff=0; | |
1895 | + | |
1896 | end=next_close; | |
1897 | no_quote=0; | |
1898 | - int diff=0; | |
1899 | + | |
1900 | if (quote_single && bchar(string, next_equal+1) | |
1901 | =='\'') { | |
1902 | end_quote=end_single; | |
1903 | @@ -445,8 +463,6 @@ | |
1904 | } else { | |
1905 | /* No Ending Quote, go to next tag */ | |
1906 | end=next_equal+diff; | |
1907 | - bdestroy(argument); | |
1908 | - argument=NULL; | |
1909 | } | |
1910 | } | |
1911 | } else { | |
1912 | @@ -465,6 +481,7 @@ | |
1913 | +1), tag_id, | |
1914 | argument, offset); | |
1915 | bdestroy(argument); | |
1916 | + argument=NULL; | |
1917 | end=next_close; | |
1918 | added=1; | |
1919 | } | |
1920 | @@ -659,6 +676,8 @@ | |
1921 | long parent_id, char force_false) { | |
1922 | int autocorrect, orig_parent, ret; | |
1923 | long i,j; | |
1924 | + bbcode_parse_tree_child_p child = NULL; | |
1925 | + | |
1926 | bbcode_p tag= bbcode_get_bbcode(parser,tree->tag_id); | |
1927 | /* Options */ | |
1928 | autocorrect = parser->options & BBCODE_AUTO_CORRECT; | |
1929 | @@ -687,7 +706,7 @@ | |
1930 | } | |
1931 | } | |
1932 | } | |
1933 | - bbcode_parse_tree_child_p child = NULL; | |
1934 | + | |
1935 | for (i = 0; i < tree->childs.size ; i++) { | |
1936 | child=(tree->childs.element[i]); | |
1937 | if (child->type==BBCODE_TREE_CHILD_TYPE_TREE) { | |
1938 | @@ -796,13 +815,16 @@ | |
1939 | bstring last_string = NULL; | |
1940 | bstring tmp_string = NULL; | |
1941 | long i; | |
1942 | + bbcode_parse_tree_p to_drop = NULL; | |
1943 | + bstring arg, content; | |
1944 | + | |
1945 | last_string=bfromcstr(""); | |
1946 | tmp_string=bfromcstr(""); | |
1947 | working_string=bfromcstr(""); | |
1948 | /* Dropped elements */ | |
1949 | - bbcode_parse_tree_p to_drop = NULL; | |
1950 | + | |
1951 | to_drop=bbcode_tree_create(); | |
1952 | - bstring arg, content; | |
1953 | + | |
1954 | content=arg=NULL; | |
1955 | /* Multipart Merging */ | |
1956 | for (i=0 ; i < tree->childs.size; i++) { | |
1957 | @@ -977,14 +999,16 @@ | |
1958 | } | |
1959 | } | |
1960 | } else { | |
1961 | + long left=0; | |
1962 | + long right=count-1; | |
1963 | + long i=count/2; | |
1964 | + long equal, pos; | |
1965 | + | |
1966 | bstring lower_tag = NULL; | |
1967 | lower_tag=bstrcpy(value); | |
1968 | btolower(lower_tag); | |
1969 | /* We start true binary */ | |
1970 | - long left=0; | |
1971 | - long right=count-1; | |
1972 | - long i=count/2; | |
1973 | - long equal, pos; | |
1974 | + | |
1975 | while (1) { | |
1976 | equal=bstrcmp(lower_tag, list[i].tag_name); | |
1977 | if (equal==0) { | |
1978 | @@ -1450,8 +1474,9 @@ | |
1979 | /* Insert a given child on a given position */ | |
1980 | void bbcode_tree_insert_child_at(bbcode_parse_tree_p tree, | |
1981 | bbcode_parse_tree_child_p bbcode_parse_tree_child, long pos) { | |
1982 | + long size; | |
1983 | bbcode_tree_check_child_size(tree, tree->childs.size+1); | |
1984 | - long size=sizeof(bbcode_parse_tree_child_p); | |
1985 | + size=sizeof(bbcode_parse_tree_child_p); | |
1986 | memmove(&(tree->childs.element[pos+1]), | |
1987 | &(tree->childs.element[pos]), size*(tree->childs.size-pos-1)); | |
1988 | tree->childs.element[pos]=bbcode_parse_tree_child; | |
1989 | @@ -1552,8 +1577,9 @@ | |
1990 | /* Remove element from the Tree array @ index */ | |
1991 | void bbcode_parse_drop_element_at(bbcode_parse_tree_array_p stack, long index) { | |
1992 | if (index<stack->size) { | |
1993 | + long i; | |
1994 | stack->size--; | |
1995 | - long i; | |
1996 | + | |
1997 | for(i=index;i<stack->size;i++){ | |
1998 | stack->element[i]=stack->element[i+1]; | |
1999 | } | |
2000 | ||
2001 | Property changes on: lib/bbcode2.c | |
2002 | ___________________________________________________________________ | |
2003 | Modified: cvs2svn:cvs-rev | |
2004 | - 1.25 | |
2005 | + 1.27 | |
2006 | ||
2007 | Index: lib/bbcode2.h | |
2008 | =================================================================== | |
2009 | --- lib/bbcode2.h (.../tags/RELEASE_1_0_2) | |
2010 | +++ lib/bbcode2.h (.../trunk) | |
2011 | @@ -75,10 +75,11 @@ | |
2012 | #define bbcode_array_element(array, pos) ((((unsigned)(pos)) < (unsigned)bbcode_array_length(array)) ? ((array)->element[(pos)]) : NULL) | |
2013 | #define bbcode_find_next(to_update,string,offset,char) if (to_update <= offset){ if (0>(to_update = bstrchrp( string, char, offset))){ to_update = blength( string )+5; } } | |
2014 | #define BBCODE_SPECIAL_CASE_NO_CHILD(argument) \ | |
2015 | + int sc_offset; \ | |
2016 | bstring close_tag=bfromcstr("[/"); \ | |
2017 | bconcat(close_tag,tag); \ | |
2018 | bcatcstr(close_tag,"]"); \ | |
2019 | - int sc_offset=binstrcaseless(string, next_close, close_tag); \ | |
2020 | + sc_offset=binstrcaseless(string, next_close, close_tag); \ | |
2021 | if (sc_offset!=BSTR_ERR){ \ | |
2022 | bbcode_tree_push_tree_child(parser, bbcode_get_cn(parser), work_stack, close_stack, bmidstr(string, offset, end-offset+1),tag_id, argument, offset); \ | |
2023 | bbcode_tree_push_string_child(bbcode_get_cn(parser), bmidstr(string,next_close+1,sc_offset-next_close-1), offset+next_close+1); \ | |
2024 | ||
2025 | Property changes on: lib/bbcode2.h | |
2026 | ___________________________________________________________________ | |
2027 | Modified: cvs2svn:cvs-rev | |
2028 | - 1.18 | |
2029 | + 1.19 | |
2030 | ||
2031 | ||
2032 | Property changes on: lib | |
2033 | ___________________________________________________________________ | |
2034 | Added: svn:ignore | |
2035 | + .deps | |
2036 | Makefile | |
2037 | *.lo | |
2038 | *.loT | |
2039 | *.slo | |
2040 | *.mk | |
2041 | *.la | |
2042 | .libs | |
2043 | libs.mk | |
2044 | ac*.m4 | |
2045 | build | |
2046 | config.h | |
2047 | config.h.in | |
2048 | config.nice | |
2049 | config.sub | |
2050 | configure | |
2051 | configure.in | |
2052 | config.status | |
2053 | config.cache | |
2054 | conftest | |
2055 | conftest.c | |
2056 | core | |
2057 | dynlib.m4 | |
2058 | install-sh | |
2059 | ltmain.sh | |
2060 | include | |
2061 | Makefile.fragments | |
2062 | Makefile.global | |
2063 | Makefile.objects | |
2064 | missing | |
2065 | mkinstalldirs | |
2066 | modules | |
2067 | scan_makefile_in.awk | |
2068 | config.guess | |
2069 | *swp | |
2070 | config.log | |
2071 | libtool | |
2072 | Debug | |
2073 | Release | |
2074 | Debug_TS | |
2075 | Release_TS | |
2076 | *.plg | |
2077 | *.patch | |
2078 | *.tgz | |
2079 | *.ncb | |
2080 | *.opt | |
2081 | *.dsw | |
2082 | autom4te.cache | |
2083 | run-tests-config.php | |
2084 | run-tests.php | |
2085 | ||
2086 | ||
2087 | Index: php_bbcode.c | |
2088 | =================================================================== | |
2089 | --- php_bbcode.c (.../tags/RELEASE_1_0_2) | |
2090 | +++ php_bbcode.c (.../trunk) | |
2091 | @@ -2,7 +2,7 @@ | |
2092 | +----------------------------------------------------------------------+ | |
2093 | | PHP Version 5 | | |
2094 | +----------------------------------------------------------------------+ | |
2095 | - | Copyright (c) 1997-2007 The PHP Group | | |
2096 | + | Copyright (c) 1997-2008 The PHP Group | | |
2097 | +----------------------------------------------------------------------+ | |
2098 | | This source file is subject to version 3.01 of the PHP license, | | |
2099 | | that is bundled with this package in the file LICENSE, and is | | |
2100 | @@ -14,9 +14,10 @@ | |
2101 | +----------------------------------------------------------------------+ | |
2102 | | Author: Xavier De Cock <void@php.net> | | |
2103 | +----------------------------------------------------------------------+ | |
2104 | +*/ | |
2105 | ||
2106 | - $Id$ | |
2107 | -*/ | |
2108 | +/* $Id$ */ | |
2109 | + | |
2110 | #ifdef HAVE_CONFIG_H | |
2111 | #include "config.h" | |
2112 | #endif | |
2113 | @@ -27,74 +28,31 @@ | |
2114 | #include "lib/bbcode2.h" | |
2115 | #include "lib/bstrlib.h" | |
2116 | ||
2117 | -#if Void_0 | |
2118 | -typedef struct _bbcode_object { | |
2119 | - zend_object std; | |
2120 | - int rsrc_id; | |
2121 | -} bbcode_object; | |
2122 | -#endif | |
2123 | +static int le_bbcode; | |
2124 | ||
2125 | -int le_bbcode; | |
2126 | -static function_entry bbcode_functions[] = { | |
2127 | - PHP_FE(bbcode_create, NULL) | |
2128 | - PHP_FE(bbcode_add_element, NULL) | |
2129 | - PHP_FE(bbcode_destroy, NULL) | |
2130 | - PHP_FE(bbcode_parse, NULL) | |
2131 | - PHP_FE(bbcode_add_smiley, NULL) | |
2132 | - PHP_FE(bbcode_set_flags, NULL) | |
2133 | - PHP_FE(bbcode_set_arg_parser, NULL) | |
2134 | - {NULL, NULL, NULL} | |
2135 | -}; | |
2136 | +#define PHP_BBCODE_CONTENT_CB 1 | |
2137 | +#define PHP_BBCODE_PARAM_CB 2 | |
2138 | ||
2139 | -#if Void_0 | |
2140 | -/* Object Part, working on it */ | |
2141 | -zend_function_entry bbcode_funcs_object[] = { | |
2142 | - PHP_ME_MAPPING(__construct, bbcode_create, NULL,0) | |
2143 | - PHP_ME_MAPPING(addElement, bbcode_add_element, NULL,0) | |
2144 | - PHP_ME_MAPPING(destroy, bbcode_destroy, NULL,0) | |
2145 | - PHP_ME_MAPPING(parse, bbcode_parse, NULL,0) | |
2146 | - {NULL, NULL, NULL} | |
2147 | -}; | |
2148 | -#endif | |
2149 | - | |
2150 | -zend_module_entry bbcode_module_entry = { | |
2151 | -#if ZEND_MODULE_API_NO >= 20010901 | |
2152 | - STANDARD_MODULE_HEADER, | |
2153 | -#endif | |
2154 | - PHP_BBCODE_EXTNAME, | |
2155 | - bbcode_functions, | |
2156 | - PHP_MINIT(bbcode), | |
2157 | - NULL, | |
2158 | - NULL, | |
2159 | - NULL, | |
2160 | - PHP_MINFO(bbcode), | |
2161 | -#if ZEND_MODULE_API_NO >= 20010901 | |
2162 | - PHP_BBCODE_VERSION, | |
2163 | -#endif | |
2164 | - STANDARD_MODULE_PROPERTIES | |
2165 | -}; | |
2166 | - | |
2167 | -#ifdef COMPILE_DL_BBCODE | |
2168 | -ZEND_GET_MODULE(bbcode) | |
2169 | -#endif | |
2170 | - | |
2171 | -/* {{{ _php_bbcode_handling_content */ | |
2172 | -/* Start user functions callback */ | |
2173 | -int _php_bbcode_handling_content(bstring content, bstring param, void *datas){ | |
2174 | +/* {{{ _php_bbcode_callback_handler | |
2175 | + Common code for content and parameter handlers */ | |
2176 | +static int _php_bbcode_callback_handler(int cb_type, bstring content, bstring param, zval *func_name) | |
2177 | +{ | |
2178 | zval *retval = NULL; | |
2179 | zval ***zargs = NULL; | |
2180 | - zval **funcname; | |
2181 | + char *callable = NULL; | |
2182 | int i, res; | |
2183 | - char *callable = NULL, *errbuf=NULL; | |
2184 | - funcname = ((zval **) datas); | |
2185 | + bstring target; | |
2186 | + char *cb_name = ""; | |
2187 | TSRMLS_FETCH(); | |
2188 | ||
2189 | - if (!zend_is_callable(*funcname, 0, &callable)) { | |
2190 | - spprintf(&errbuf, 0, "function `%s' is not a function name", callable); | |
2191 | - zend_error(E_WARNING, "[BBCode] (_php_bbcode_handling_content) %s", errbuf); | |
2192 | - efree(errbuf); | |
2193 | - efree(callable); | |
2194 | - return 0; | |
2195 | + switch (cb_type) { | |
2196 | + case PHP_BBCODE_CONTENT_CB: | |
2197 | + target = content; | |
2198 | + break; | |
2199 | + | |
2200 | + case PHP_BBCODE_PARAM_CB: | |
2201 | + target = param; | |
2202 | + break; | |
2203 | } | |
2204 | ||
2205 | zargs = (zval ***) emalloc(sizeof(zval **) * 2); | |
2206 | @@ -105,223 +63,218 @@ | |
2207 | MAKE_STD_ZVAL(*zargs[1]); | |
2208 | ZVAL_STRINGL(*zargs[1], bdata(param), blength(param), 1); | |
2209 | ||
2210 | - res = call_user_function_ex(EG(function_table), NULL, *funcname, &retval, 2, zargs, 1, NULL TSRMLS_CC); | |
2211 | - | |
2212 | - if (res == SUCCESS) { | |
2213 | - if (zargs) { | |
2214 | - for (i = 0; i < 2; i++) { | |
2215 | - zval_ptr_dtor(zargs[i]); | |
2216 | - efree(zargs[i]); | |
2217 | - } | |
2218 | - efree(zargs); | |
2219 | + res = call_user_function_ex(EG(function_table), NULL, func_name, &retval, 2, zargs, 1, NULL TSRMLS_CC); | |
2220 | + | |
2221 | + if (res != SUCCESS) { | |
2222 | + if (!zend_is_callable(func_name, 0, &callable TSRMLS_CC)) { | |
2223 | + php_error_docref(NULL TSRMLS_CC, E_WARNING, "function `%s' is not callable", callable); | |
2224 | + } else { | |
2225 | + php_error_docref(NULL TSRMLS_CC, E_WARNING, "callback function %s() failed", callable); | |
2226 | } | |
2227 | - } else { | |
2228 | - zend_error(E_WARNING, "[BBCode] (_php_bbcode_handling_content) call_user_function_ex failed for function %s()", callable); | |
2229 | - } | |
2230 | - efree(callable); | |
2231 | - if (&retval) { | |
2232 | + efree(callable); | |
2233 | + } else if (&retval != NULL) { | |
2234 | convert_to_string_ex(&retval); | |
2235 | - if(Z_STRLEN_P(retval)){ | |
2236 | - bassignblk(content,Z_STRVAL_P(retval), Z_STRLEN_P(retval)); | |
2237 | + if (Z_STRLEN_P(retval)) { | |
2238 | + bassignblk(target, Z_STRVAL_P(retval), Z_STRLEN_P(retval)); | |
2239 | } else { | |
2240 | - bdelete(content,0,blength(content)); | |
2241 | + bdelete(target, 0, blength(target)); | |
2242 | } | |
2243 | zval_ptr_dtor(&retval); | |
2244 | } | |
2245 | + | |
2246 | + /* Free zargs */ | |
2247 | + for (i = 0; i < 2; i++) { | |
2248 | + zval_ptr_dtor(zargs[i]); | |
2249 | + efree(zargs[i]); | |
2250 | + } | |
2251 | + efree(zargs); | |
2252 | + | |
2253 | return 0; | |
2254 | } | |
2255 | /* }}} */ | |
2256 | -/* {{{ _php_bbcode_handling_param */ | |
2257 | -int _php_bbcode_handling_param(bstring content, bstring param, void *datas){ | |
2258 | - zval *retval = NULL; | |
2259 | - zval ***zargs = NULL; | |
2260 | - zval **funcname; | |
2261 | - int i, res; | |
2262 | - char *callable = NULL, *errbuf=NULL; | |
2263 | - funcname = ((zval **) datas); | |
2264 | - TSRMLS_FETCH(); | |
2265 | ||
2266 | - if (!zend_is_callable(*funcname, 0, &callable)) { | |
2267 | - spprintf(&errbuf, 0, "function `%s' is not a function name", callable); | |
2268 | - zend_error(E_WARNING, "[BBCode] (_php_bbcode_handling_param) %s", errbuf); | |
2269 | - efree(errbuf); | |
2270 | - efree(callable); | |
2271 | - return 0; | |
2272 | - } | |
2273 | +/* {{{ _php_bbcode_content_handler */ | |
2274 | +static int _php_bbcode_content_handler(bstring content, bstring param, void *func_data) | |
2275 | +{ | |
2276 | + return _php_bbcode_callback_handler(PHP_BBCODE_CONTENT_CB, content, param, func_data); | |
2277 | +} | |
2278 | +/* }}} */ | |
2279 | ||
2280 | - zargs = (zval ***) emalloc(sizeof(zval **) * 2); | |
2281 | - zargs[0] = emalloc(sizeof(zval *)); | |
2282 | - MAKE_STD_ZVAL(*zargs[0]); | |
2283 | - ZVAL_STRINGL(*zargs[0], bdata(content), blength(content), 1); | |
2284 | - zargs[1] = emalloc(sizeof(zval *)); | |
2285 | - MAKE_STD_ZVAL(*zargs[1]); | |
2286 | - ZVAL_STRINGL(*zargs[1], bdata(param), blength(param), 1); | |
2287 | - | |
2288 | - res = call_user_function_ex(EG(function_table), NULL, *funcname, &retval, 2, zargs, 1, NULL TSRMLS_CC); | |
2289 | - | |
2290 | - if (res == SUCCESS) { | |
2291 | - if (zargs) { | |
2292 | - for (i = 0; i < 2; i++) { | |
2293 | - zval_ptr_dtor(zargs[i]); | |
2294 | - efree(zargs[i]); | |
2295 | - } | |
2296 | - efree(zargs); | |
2297 | - } | |
2298 | - } else { | |
2299 | - zend_error(E_WARNING, "[BBCode] (_php_bbcode_handling_param) call_user_function_ex failed for function %s()", callable); | |
2300 | - } | |
2301 | - efree(callable); | |
2302 | - if (&retval) { | |
2303 | - convert_to_string_ex(&retval); | |
2304 | - if(Z_STRLEN_P(retval)){ | |
2305 | - bassignblk(param,Z_STRVAL_P(retval), Z_STRLEN_P(retval)); | |
2306 | - } else { | |
2307 | - bdelete(param,0,blength(param)); | |
2308 | - } | |
2309 | - zval_ptr_dtor(&retval); | |
2310 | - } | |
2311 | - return 0; | |
2312 | +/* {{{ _php_bbcode_param_handler */ | |
2313 | +static int _php_bbcode_param_handler(bstring content, bstring param, void *func_data) | |
2314 | +{ | |
2315 | + return _php_bbcode_callback_handler(PHP_BBCODE_PARAM_CB, content, param, func_data); | |
2316 | } | |
2317 | -/* End User function Callback */ | |
2318 | /* }}} */ | |
2319 | -/* {{{ _php_bbcode_add_element */ | |
2320 | -/* Fill a bbcode_container */ | |
2321 | -static void _php_bbcode_add_element(bbcode_parser_p parser, char *tag_name, zval *content TSRMLS_DC) { | |
2322 | + | |
2323 | +/* {{{ _php_bbcode_add_element | |
2324 | + Fills a bbcode_container */ | |
2325 | +static void _php_bbcode_add_element(bbcode_parser_p parser, char *tag_name, int tag_name_len, zval *content TSRMLS_DC) | |
2326 | +{ | |
2327 | zval **e; | |
2328 | long type; | |
2329 | - char *name; | |
2330 | - char empty[]=""; | |
2331 | - char all[]="all"; | |
2332 | - int (*content_handling_func)(bstring content, bstring param, void *func_data)=NULL; | |
2333 | - int (*param_handling_func)(bstring content, bstring param, void *func_data)=NULL; | |
2334 | - HashTable *ht=NULL; | |
2335 | - long flags=0; | |
2336 | - char *childs=all; | |
2337 | - int childs_len=3; | |
2338 | - char *parents=all; | |
2339 | - int parents_len=3; | |
2340 | + char *callback_name; | |
2341 | + char empty[] = ""; | |
2342 | + char all[] = "all"; | |
2343 | + int (*content_handling_func)(bstring content, bstring param, void *func_data) = NULL; | |
2344 | + int (*param_handling_func)(bstring content, bstring param, void *func_data) = NULL; | |
2345 | + HashTable *ht = NULL; | |
2346 | + long flags = 0; | |
2347 | + char *childs = all; | |
2348 | + int childs_len = 3; | |
2349 | + char *parents = all; | |
2350 | + int parents_len = 3; | |
2351 | char *open_tag, *close_tag, *default_arg; | |
2352 | - int open_tag_len, close_tag_len, default_arg_len; | |
2353 | - open_tag_len = close_tag_len = default_arg_len = 0; | |
2354 | - zval **content_handling = NULL; | |
2355 | - zval **param_handling = NULL; | |
2356 | - | |
2357 | - if (Z_TYPE_P(content) == IS_ARRAY) { | |
2358 | - ht = HASH_OF(content); | |
2359 | - } | |
2360 | - if ((SUCCESS == zend_hash_find(ht, "flags", sizeof("flags"), (void *) &e)) | |
2361 | - && (Z_TYPE_PP(e) == IS_LONG)) { | |
2362 | - flags = Z_LVAL_PP(e); | |
2363 | + int open_tag_len = 0, close_tag_len = 0, default_arg_len = 0; | |
2364 | + zval *content_handling = NULL; | |
2365 | + zval *param_handling = NULL; | |
2366 | + | |
2367 | + if (Z_TYPE_P(content) == IS_ARRAY) { | |
2368 | + ht = HASH_OF(content); | |
2369 | } | |
2370 | - if ((SUCCESS == zend_hash_find(ht, "type", sizeof("type"), (void *) &e)) | |
2371 | - && (Z_TYPE_PP(e) == IS_LONG)) { | |
2372 | + | |
2373 | + /* flags */ | |
2374 | + if ((SUCCESS == zend_hash_find(ht, "flags", sizeof("flags"), (void *) &e)) && | |
2375 | + (Z_TYPE_PP(e) == IS_LONG) | |
2376 | + ) { | |
2377 | + flags = Z_LVAL_PP(e); | |
2378 | + } | |
2379 | + | |
2380 | + /* type */ | |
2381 | + if ((SUCCESS == zend_hash_find(ht, "type", sizeof("type"), (void *) &e)) && | |
2382 | + (Z_TYPE_PP(e) == IS_LONG) | |
2383 | + ) { | |
2384 | type = Z_LVAL_PP(e); | |
2385 | } else { | |
2386 | - zend_error(E_WARNING, "[BBCode] (bbcode_add_element) No type specified for tag : [%s]",tag_name); | |
2387 | + php_error_docref(NULL TSRMLS_CC, E_WARNING, "No type specified for tag [%s]", tag_name); | |
2388 | return; | |
2389 | } | |
2390 | - if ((SUCCESS == zend_hash_find(ht, "open_tag", sizeof("open_tag"), (void *) &e)) | |
2391 | - && (Z_TYPE_PP(e) == IS_STRING) && Z_STRLEN_PP(e)) { | |
2392 | + | |
2393 | + /* open_tag */ | |
2394 | + if ((SUCCESS == zend_hash_find(ht, "open_tag", sizeof("open_tag"), (void *) &e)) && | |
2395 | + (Z_TYPE_PP(e) == IS_STRING) && Z_STRLEN_PP(e) | |
2396 | + ) { | |
2397 | open_tag = Z_STRVAL_PP(e); | |
2398 | - open_tag_len=Z_STRLEN_PP(e); | |
2399 | + open_tag_len = Z_STRLEN_PP(e); | |
2400 | } else { | |
2401 | - open_tag=empty; | |
2402 | + open_tag = empty; | |
2403 | } | |
2404 | - if ((SUCCESS == zend_hash_find(ht, "close_tag", sizeof("close_tag"), (void *) &e)) | |
2405 | - && (Z_TYPE_PP(e) == IS_STRING) && Z_STRLEN_PP(e)) { | |
2406 | + | |
2407 | + /* close_tag */ | |
2408 | + if ((SUCCESS == zend_hash_find(ht, "close_tag", sizeof("close_tag"), (void *) &e)) && | |
2409 | + (Z_TYPE_PP(e) == IS_STRING) && Z_STRLEN_PP(e) | |
2410 | + ) { | |
2411 | close_tag = Z_STRVAL_PP(e); | |
2412 | - close_tag_len=Z_STRLEN_PP(e); | |
2413 | + close_tag_len = Z_STRLEN_PP(e); | |
2414 | } else { | |
2415 | - close_tag=empty; | |
2416 | + close_tag = empty; | |
2417 | } | |
2418 | - if ((SUCCESS == zend_hash_find(ht, "default_arg", sizeof("default_arg"), (void *) &e)) | |
2419 | - && (Z_TYPE_PP(e) == IS_STRING) && Z_STRLEN_PP(e)) { | |
2420 | + | |
2421 | + /* default_arg */ | |
2422 | + if ((SUCCESS == zend_hash_find(ht, "default_arg", sizeof("default_arg"), (void *) &e)) && | |
2423 | + (Z_TYPE_PP(e) == IS_STRING) && Z_STRLEN_PP(e) | |
2424 | + ) { | |
2425 | default_arg = Z_STRVAL_PP(e); | |
2426 | default_arg_len = Z_STRLEN_PP(e); | |
2427 | } else { | |
2428 | default_arg = empty; | |
2429 | } | |
2430 | - if ((SUCCESS == zend_hash_find(ht, "content_handling", sizeof("content_handling"), (void *) &e))) { | |
2431 | + | |
2432 | + /* content_handling */ | |
2433 | + if ((SUCCESS == zend_hash_find(ht, "content_handling", sizeof("content_handling"), (void *) &e)) && | |
2434 | + ((Z_TYPE_PP(e) == IS_STRING && Z_STRLEN_PP(e)) || (Z_TYPE_PP(e) == IS_ARRAY)) | |
2435 | + ) { | |
2436 | + SEPARATE_ZVAL(e); | |
2437 | if (Z_TYPE_PP(e) != IS_STRING && Z_TYPE_PP(e) != IS_ARRAY){ | |
2438 | - SEPARATE_ZVAL(e); | |
2439 | convert_to_string_ex(e); | |
2440 | } | |
2441 | - if (!zend_is_callable(*e, 0, &name)) { | |
2442 | - php_error_docref(NULL TSRMLS_CC, E_WARNING, "First argument is expected to be a valid callback, '%s' was given", name); | |
2443 | - efree(name); | |
2444 | + if (!zend_is_callable(*e, 0, &callback_name TSRMLS_CC)) { | |
2445 | + php_error_docref(NULL TSRMLS_CC, E_WARNING, "First argument is expected to be a valid callback, '%s' was given", callback_name); | |
2446 | + efree(callback_name); | |
2447 | return; | |
2448 | } | |
2449 | - efree(name); | |
2450 | - content_handling = e; | |
2451 | -#if (PHP_MAJOR_VERSION >= 5) && (PHP_MINOR_VERSION >= 3) | |
2452 | - Z_ADDREF_P(*content_handling); | |
2453 | -#else | |
2454 | - ZVAL_ADDREF(*content_handling); | |
2455 | -#endif | |
2456 | - content_handling_func= _php_bbcode_handling_content; | |
2457 | + efree(callback_name); | |
2458 | + content_handling = *e; | |
2459 | + content_handling_func = _php_bbcode_content_handler; | |
2460 | } else { | |
2461 | - content_handling=NULL; | |
2462 | + content_handling_func = NULL; | |
2463 | + content_handling = NULL; | |
2464 | } | |
2465 | - if ((SUCCESS == zend_hash_find(ht, "param_handling", sizeof("param_handling"), (void *) &e)) | |
2466 | - && ((Z_TYPE_PP(e) == IS_STRING && Z_STRLEN_PP(e)) || (Z_TYPE_PP(e)==IS_ARRAY))) { | |
2467 | + | |
2468 | + /* param_handling */ | |
2469 | + if ((SUCCESS == zend_hash_find(ht, "param_handling", sizeof("param_handling"), (void *) &e)) && | |
2470 | + ((Z_TYPE_PP(e) == IS_STRING && Z_STRLEN_PP(e)) || (Z_TYPE_PP(e) == IS_ARRAY)) | |
2471 | + ) { | |
2472 | + SEPARATE_ZVAL(e); | |
2473 | if (Z_TYPE_PP(e) != IS_STRING && Z_TYPE_PP(e) != IS_ARRAY){ | |
2474 | - SEPARATE_ZVAL(e); | |
2475 | convert_to_string_ex(e); | |
2476 | } | |
2477 | - if (!zend_is_callable(*e, 0, &name)) { | |
2478 | - php_error_docref(NULL TSRMLS_CC, E_WARNING, "First argument is expected to be a valid callback, '%s' was given", name); | |
2479 | - efree(name); | |
2480 | + if (!zend_is_callable(*e, 0, &callback_name TSRMLS_CC)) { | |
2481 | + php_error_docref(NULL TSRMLS_CC, E_WARNING, "First argument is expected to be a valid callback, '%s' was given", callback_name); | |
2482 | + efree(callback_name); | |
2483 | return; | |
2484 | } | |
2485 | - efree(name); | |
2486 | - param_handling = e; | |
2487 | -#if (PHP_MAJOR_VERSION >= 5) && (PHP_MINOR_VERSION >= 3) | |
2488 | - Z_ADDREF_P(*param_handling); | |
2489 | -#else | |
2490 | - ZVAL_ADDREF(*param_handling); | |
2491 | -#endif | |
2492 | - param_handling_func= _php_bbcode_handling_param; | |
2493 | + efree(callback_name); | |
2494 | + param_handling = *e; | |
2495 | + param_handling_func = _php_bbcode_param_handler; | |
2496 | + } else { | |
2497 | + param_handling_func = NULL; | |
2498 | + param_handling = NULL; | |
2499 | } | |
2500 | - if ((SUCCESS == zend_hash_find(ht, "childs", sizeof("childs"), (void *) &e)) | |
2501 | - && (Z_TYPE_PP(e) == IS_STRING)) { | |
2502 | + | |
2503 | + /* childs */ | |
2504 | + if ((SUCCESS == zend_hash_find(ht, "childs", sizeof("childs"), (void *) &e)) && | |
2505 | + (Z_TYPE_PP(e) == IS_STRING) | |
2506 | + ) { | |
2507 | childs = Z_STRVAL_PP(e); | |
2508 | childs_len = Z_STRLEN_PP(e); | |
2509 | } | |
2510 | - if ((SUCCESS == zend_hash_find(ht, "parents", sizeof("parents"), (void *) &e)) | |
2511 | - && (Z_TYPE_PP(e) == IS_STRING) && Z_STRLEN_PP(e)) { | |
2512 | + | |
2513 | + /* parents */ | |
2514 | + if ((SUCCESS == zend_hash_find(ht, "parents", sizeof("parents"), (void *) &e)) && | |
2515 | + (Z_TYPE_PP(e) == IS_STRING) && Z_STRLEN_PP(e) | |
2516 | + ) { | |
2517 | parents = Z_STRVAL_PP(e); | |
2518 | parents_len = Z_STRLEN_PP(e); | |
2519 | } | |
2520 | + | |
2521 | bbcode_parser_add_ruleset(parser, type, flags, | |
2522 | - tag_name, strlen(tag_name), | |
2523 | - open_tag, open_tag_len, | |
2524 | - close_tag, close_tag_len, default_arg, default_arg_len, parents, | |
2525 | - parents_len, childs, childs_len, | |
2526 | - param_handling_func, | |
2527 | - content_handling_func, | |
2528 | - (void *)param_handling, | |
2529 | - (void *)content_handling); | |
2530 | + tag_name, tag_name_len, | |
2531 | + open_tag, open_tag_len, | |
2532 | + close_tag, close_tag_len, | |
2533 | + default_arg, default_arg_len, | |
2534 | + parents, parents_len, | |
2535 | + childs, childs_len, | |
2536 | + param_handling_func, | |
2537 | + content_handling_func, | |
2538 | + (void *)param_handling, | |
2539 | + (void *)content_handling | |
2540 | + ); | |
2541 | } | |
2542 | /* }}} */ | |
2543 | -/* Destructors */ | |
2544 | -ZEND_RSRC_DTOR_FUNC(php_bbcode_dtor) | |
2545 | + | |
2546 | +/* {{{ Resource destructor */ | |
2547 | +static ZEND_RSRC_DTOR_FUNC(php_bbcode_dtor) | |
2548 | { | |
2549 | - bbcode_parser_p parser = (bbcode_parser_p)rsrc->ptr; | |
2550 | - if (parser) { | |
2551 | - bbcode_parser_free(parser); | |
2552 | - } | |
2553 | + bbcode_parser_p parser = (bbcode_parser_p)rsrc->ptr; | |
2554 | + if (parser) { | |
2555 | + bbcode_parser_free(parser); | |
2556 | + } | |
2557 | } | |
2558 | -/* End destructors */ | |
2559 | -/* INIT / SHUTDOWN */ | |
2560 | -PHP_MINIT_FUNCTION(bbcode) | |
2561 | +/* }}} */ | |
2562 | + | |
2563 | +/* {{{ Module INIT / SHUTDOWN */ | |
2564 | +static PHP_MINIT_FUNCTION(bbcode) | |
2565 | { | |
2566 | - le_bbcode = zend_register_list_destructors_ex(php_bbcode_dtor, NULL, PHP_BBCODE_RES_NAME, module_number); | |
2567 | + le_bbcode = zend_register_list_destructors_ex(php_bbcode_dtor, NULL, PHP_BBCODE_RES_NAME, module_number); | |
2568 | + | |
2569 | /* BBCODE Types */ | |
2570 | REGISTER_LONG_CONSTANT("BBCODE_TYPE_NOARG", BBCODE_TYPE_NOARG, CONST_CS|CONST_PERSISTENT); | |
2571 | REGISTER_LONG_CONSTANT("BBCODE_TYPE_SINGLE", BBCODE_TYPE_SINGLE, CONST_CS|CONST_PERSISTENT); | |
2572 | REGISTER_LONG_CONSTANT("BBCODE_TYPE_ARG", BBCODE_TYPE_ARG, CONST_CS|CONST_PERSISTENT); | |
2573 | REGISTER_LONG_CONSTANT("BBCODE_TYPE_OPTARG", BBCODE_TYPE_OPTARG, CONST_CS|CONST_PERSISTENT); | |
2574 | REGISTER_LONG_CONSTANT("BBCODE_TYPE_ROOT", BBCODE_TYPE_ROOT, CONST_CS|CONST_PERSISTENT); | |
2575 | + | |
2576 | /* BBCODE Flags */ | |
2577 | REGISTER_LONG_CONSTANT("BBCODE_FLAGS_ARG_PARSING", BBCODE_FLAGS_ARG_PARSING, CONST_CS|CONST_PERSISTENT); | |
2578 | REGISTER_LONG_CONSTANT("BBCODE_FLAGS_CDATA_NOT_ALLOWED", BBCODE_FLAGS_CDATA_NOT_ALLOWED, CONST_CS|CONST_PERSISTENT); | |
2579 | @@ -330,42 +283,52 @@ | |
2580 | REGISTER_LONG_CONSTANT("BBCODE_FLAGS_ONE_OPEN_PER_LEVEL", BBCODE_FLAGS_ONE_OPEN_PER_LEVEL, CONST_CS|CONST_PERSISTENT); | |
2581 | REGISTER_LONG_CONSTANT("BBCODE_FLAGS_REMOVE_IF_EMPTY", BBCODE_FLAGS_REMOVE_IF_EMPTY, CONST_CS|CONST_PERSISTENT); | |
2582 | REGISTER_LONG_CONSTANT("BBCODE_FLAGS_DENY_REOPEN_CHILD", BBCODE_FLAGS_DENY_REOPEN_CHILD, CONST_CS|CONST_PERSISTENT); | |
2583 | - /* Parsers Flags */ | |
2584 | + | |
2585 | + /* Parser Flags */ | |
2586 | + | |
2587 | /* Quotes styles */ | |
2588 | REGISTER_LONG_CONSTANT("BBCODE_ARG_DOUBLE_QUOTE", BBCODE_ARG_DOUBLE_QUOTE, CONST_CS|CONST_PERSISTENT); | |
2589 | REGISTER_LONG_CONSTANT("BBCODE_ARG_SINGLE_QUOTE", BBCODE_ARG_SINGLE_QUOTE, CONST_CS|CONST_PERSISTENT); | |
2590 | REGISTER_LONG_CONSTANT("BBCODE_ARG_HTML_QUOTE", BBCODE_ARG_HTML_QUOTE, CONST_CS|CONST_PERSISTENT); | |
2591 | REGISTER_LONG_CONSTANT("BBCODE_ARG_QUOTE_ESCAPING", BBCODE_ARG_QUOTE_ESCAPING, CONST_CS|CONST_PERSISTENT); | |
2592 | + | |
2593 | /* Parsing Options */ | |
2594 | REGISTER_LONG_CONSTANT("BBCODE_AUTO_CORRECT", BBCODE_AUTO_CORRECT, CONST_CS|CONST_PERSISTENT); | |
2595 | REGISTER_LONG_CONSTANT("BBCODE_CORRECT_REOPEN_TAGS", BBCODE_CORRECT_REOPEN_TAGS, CONST_CS|CONST_PERSISTENT); | |
2596 | REGISTER_LONG_CONSTANT("BBCODE_DISABLE_TREE_BUILD", BBCODE_DISABLE_TREE_BUILD, CONST_CS|CONST_PERSISTENT); | |
2597 | - /* Smileys Options */ | |
2598 | + | |
2599 | + /* Smiley Options */ | |
2600 | REGISTER_LONG_CONSTANT("BBCODE_DEFAULT_SMILEYS_ON", BBCODE_DEFAULT_SMILEYS_ON, CONST_CS|CONST_PERSISTENT); | |
2601 | REGISTER_LONG_CONSTANT("BBCODE_DEFAULT_SMILEYS_OFF", BBCODE_DEFAULT_SMILEYS_OFF, CONST_CS|CONST_PERSISTENT); | |
2602 | REGISTER_LONG_CONSTANT("BBCODE_FORCE_SMILEYS_OFF", BBCODE_FORCE_SMILEYS_OFF, CONST_CS|CONST_PERSISTENT); | |
2603 | REGISTER_LONG_CONSTANT("BBCODE_SMILEYS_CASE_INSENSITIVE", BBCODE_SMILEYS_CASE_INSENSITIVE, CONST_CS|CONST_PERSISTENT); | |
2604 | + | |
2605 | /* FLAG SET / ADD / REMOVE */ | |
2606 | REGISTER_LONG_CONSTANT("BBCODE_SET_FLAGS_SET", BBCODE_SET_FLAGS_SET, CONST_CS|CONST_PERSISTENT); | |
2607 | REGISTER_LONG_CONSTANT("BBCODE_SET_FLAGS_ADD", BBCODE_SET_FLAGS_ADD, CONST_CS|CONST_PERSISTENT); | |
2608 | REGISTER_LONG_CONSTANT("BBCODE_SET_FLAGS_REMOVE", BBCODE_SET_FLAGS_REMOVE, CONST_CS|CONST_PERSISTENT); | |
2609 | - return SUCCESS; | |
2610 | + | |
2611 | + return SUCCESS; | |
2612 | } | |
2613 | -/* END INIT/SHUTDOWN */ | |
2614 | +/* }}} */ | |
2615 | ||
2616 | #if Void_0 | |
2617 | -/* {{{ | |
2618 | - * Working on it, not finished yet | |
2619 | - * OBJECT START */ | |
2620 | -static void _php_bbcode_object_free_storage(void *object TSRMLS_DC){ | |
2621 | +typedef struct _bbcode_object { | |
2622 | + zend_object std; | |
2623 | + int rsrc_id; | |
2624 | +} bbcode_object; | |
2625 | + | |
2626 | +/* {{{ TODO: Not finished yet! */ | |
2627 | +static void _php_bbcode_object_free_storage(void *object TSRMLS_DC) | |
2628 | +{ | |
2629 | bbcode_object *intern = (bbcode_object *)object; | |
2630 | zval *pointer; | |
2631 | zval *return_value; | |
2632 | - | |
2633 | + | |
2634 | zend_object_std_dtor(&intern->std TSRMLS_CC); | |
2635 | ||
2636 | bbcode_container *container; | |
2637 | - | |
2638 | + | |
2639 | if (intern->rsrc_id) { | |
2640 | ALLOC_INIT_ZVAL(pointer); | |
2641 | ALLOC_INIT_ZVAL(return_value); | |
2642 | @@ -373,9 +336,9 @@ | |
2643 | Z_TYPE_P(pointer) = IS_LONG; | |
2644 | Z_LVAL_P(pointer) = intern->rsrc_id; | |
2645 | ZEND_FETCH_RESOURCE(container, bbcode_container*, &pointer, -1, PHP_BBCODE_RES_NAME, le_bbcode); | |
2646 | - bbcode_destroy_tag_stack(container); | |
2647 | - efree(return_value); | |
2648 | - zval_ptr_dtor(&pointer); | |
2649 | + bbcode_destroy_tag_stack(container); | |
2650 | + efree(return_value); | |
2651 | + zval_ptr_dtor(&pointer); | |
2652 | zend_list_delete(intern->rsrc_id); | |
2653 | } | |
2654 | efree(object); | |
2655 | @@ -397,120 +360,130 @@ | |
2656 | NULL TSRMLS_CC); | |
2657 | retval->handlers = handlers; | |
2658 | } | |
2659 | -/* END OBJECT | |
2660 | - * }}} */ | |
2661 | +/* }}} */ | |
2662 | #endif | |
2663 | + | |
2664 | /* {{{ proto resource bbcode_container bbcode_create([array initial_tags]) | |
2665 | - create a new bbcode_container and add elements given in the array to the resource | |
2666 | - initial_tags is an associative array with tag_name=>tag_definition | |
2667 | - (see bbcode_add_element to view tag_definition format) */ | |
2668 | -PHP_FUNCTION(bbcode_create) | |
2669 | + Creates a new bbcode_container and adds elements given in the array to the resource. */ | |
2670 | +static PHP_FUNCTION(bbcode_create) | |
2671 | { | |
2672 | - zval *bbcode_entry=NULL; | |
2673 | + zval *bbcode_entry = NULL; | |
2674 | bbcode_parser_p parser = NULL; | |
2675 | - | |
2676 | + | |
2677 | if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|a", &bbcode_entry) == FAILURE) { | |
2678 | - RETURN_NULL(); | |
2679 | - } | |
2680 | - | |
2681 | - /* Container init */ | |
2682 | - parser=bbcode_parser_create(); | |
2683 | - if (parser==NULL){ | |
2684 | - zend_error(E_ERROR, "[BBCode] (bbcode_create) Unable to allocate memory for tag_stack"); | |
2685 | - } | |
2686 | - bbcode_parser_set_flags(parser, BBCODE_AUTO_CORRECT|BBCODE_ARG_DOUBLE_QUOTE|BBCODE_ARG_SINGLE_QUOTE|BBCODE_ARG_HTML_QUOTE|BBCODE_DEFAULT_SMILEYS_ON); | |
2687 | - /* If array given initialisation */ | |
2688 | - if(bbcode_entry!=NULL){ | |
2689 | - int i; | |
2690 | - HashTable *myht=NULL; | |
2691 | - | |
2692 | - if (Z_TYPE_P(bbcode_entry) == IS_ARRAY) { | |
2693 | - myht = HASH_OF(bbcode_entry); | |
2694 | - } | |
2695 | - | |
2696 | - i = myht ? zend_hash_num_elements(myht) : 0; | |
2697 | - if (i > 0) { | |
2698 | - char *key; | |
2699 | - zval **data; | |
2700 | - ulong index; | |
2701 | - uint key_len; | |
2702 | - HashPosition pos; | |
2703 | - HashTable *tmp_ht; | |
2704 | + RETURN_NULL(); | |
2705 | + } | |
2706 | + | |
2707 | + /* Container init */ | |
2708 | + parser = bbcode_parser_create(); | |
2709 | + if (parser == NULL){ | |
2710 | + php_error_docref(NULL TSRMLS_CC, E_ERROR, "Unable to allocate memory for tag_stack"); | |
2711 | + } | |
2712 | + bbcode_parser_set_flags(parser, BBCODE_AUTO_CORRECT|BBCODE_ARG_DOUBLE_QUOTE|BBCODE_ARG_SINGLE_QUOTE|BBCODE_ARG_HTML_QUOTE|BBCODE_DEFAULT_SMILEYS_ON); | |
2713 | + | |
2714 | + /* If array given initialisation */ | |
2715 | + if (bbcode_entry != NULL) { | |
2716 | + int i; | |
2717 | + HashTable *myht = NULL; | |
2718 | + | |
2719 | + if (Z_TYPE_P(bbcode_entry) == IS_ARRAY) { | |
2720 | + myht = HASH_OF(bbcode_entry); | |
2721 | + } | |
2722 | + | |
2723 | + i = myht ? zend_hash_num_elements(myht) : 0; | |
2724 | + if (i > 0) { | |
2725 | + char *key; | |
2726 | + zval **data; | |
2727 | + ulong index; | |
2728 | + uint key_len; | |
2729 | + HashPosition pos; | |
2730 | + HashTable *tmp_ht; | |
2731 | + | |
2732 | /* Array walking */ | |
2733 | - zend_hash_internal_pointer_reset_ex(myht, &pos); | |
2734 | - for (;; zend_hash_move_forward_ex(myht, &pos)) { | |
2735 | - i = zend_hash_get_current_key_ex(myht, &key, &key_len, &index, 0, &pos); | |
2736 | - if (i == HASH_KEY_NON_EXISTANT) | |
2737 | - break; | |
2738 | - | |
2739 | - if (zend_hash_get_current_data_ex(myht, (void **) &data, &pos) == SUCCESS) { | |
2740 | - tmp_ht = HASH_OF(*data); | |
2741 | - if (tmp_ht) { | |
2742 | - tmp_ht->nApplyCount++; | |
2743 | - } | |
2744 | - if (i == HASH_KEY_IS_STRING) { | |
2745 | + zend_hash_internal_pointer_reset_ex(myht, &pos); | |
2746 | + for (;; zend_hash_move_forward_ex(myht, &pos)) { | |
2747 | + i = zend_hash_get_current_key_ex(myht, &key, &key_len, &index, 0, &pos); | |
2748 | + if (i == HASH_KEY_NON_EXISTANT) { | |
2749 | + break; | |
2750 | + } | |
2751 | + | |
2752 | + if (zend_hash_get_current_data_ex(myht, (void **) &data, &pos) == SUCCESS) { | |
2753 | + tmp_ht = HASH_OF(*data); | |
2754 | + if (tmp_ht) { | |
2755 | + tmp_ht->nApplyCount++; | |
2756 | + } | |
2757 | + if (i == HASH_KEY_IS_STRING) { | |
2758 | /* Add Element to container */ | |
2759 | - _php_bbcode_add_element(parser,key,*data TSRMLS_CC); | |
2760 | - } | |
2761 | - if (tmp_ht) { | |
2762 | - tmp_ht->nApplyCount--; | |
2763 | - } | |
2764 | - } | |
2765 | - } | |
2766 | - } | |
2767 | - } | |
2768 | - /* Registering Resource & returning */ | |
2769 | - ZEND_REGISTER_RESOURCE(return_value, parser, le_bbcode); | |
2770 | + _php_bbcode_add_element(parser, key, key_len - 1, *data TSRMLS_CC); | |
2771 | + } | |
2772 | + if (tmp_ht) { | |
2773 | + tmp_ht->nApplyCount--; | |
2774 | + } | |
2775 | + } | |
2776 | + } | |
2777 | + } | |
2778 | + } | |
2779 | + | |
2780 | + /* Register resource and return it */ | |
2781 | + ZEND_REGISTER_RESOURCE(return_value, parser, le_bbcode); | |
2782 | } | |
2783 | /* }}} */ | |
2784 | -/* {{{ proto boolean bbcode_add_element(resource bbcode_container, string tag_name , array tag_definition) | |
2785 | - add a new tag to the given bbcode_container | |
2786 | - tag_definition is an array with those elements: | |
2787 | - needed: | |
2788 | - * 'type' => Type of the tag (view BBCODE_TYPE_* to view available tags) | |
2789 | - optionnals: | |
2790 | - * 'flags' =0 => features of the tag (view BBCODE_FLAGS_* to view capacities) | |
2791 | - * 'open_tag' = '' => the replacement open_tag (1) | |
2792 | - * 'close_tag' = '' => the replacement close_tag (1) | |
2793 | - * 'default_argument' = '' => For Optionnal argument tags argument taken if not given (1) | |
2794 | - * 'content_handling' = '' => Function name called as callback for content ( string new_content content_function ( content, param ); ) | |
2795 | - * 'param_handling' = '' => Function name called as callback for content ( string new_content content_function ( content, param ); ) | |
2796 | - * 'childs' = 'all' => Comma separated list of accepted childs (use !list to make a list of non accepted childs, no space between tag_names) | |
2797 | - * 'parents' = 'all' => Comma separated list of tags of which this tag could be a child | |
2798 | - (1) note that the {CONTENT} string is automatically replaced by the content of the tag and {PARAM} by the parameter | |
2799 | - */ | |
2800 | -PHP_FUNCTION(bbcode_add_element) | |
2801 | + | |
2802 | +/* {{{ proto boolean bbcode_add_element(resource bbcode_container, string tag_name, array tag_definition) | |
2803 | + Adds a new tag to the given bbcode_container. */ | |
2804 | +static PHP_FUNCTION(bbcode_add_element) | |
2805 | { | |
2806 | zval *z_bbcode_parser; | |
2807 | zval *bbcode_entry; | |
2808 | - bbcode_parser_p parser=NULL; | |
2809 | + bbcode_parser_p parser = NULL; | |
2810 | char *tag_name; | |
2811 | - int tag_len; | |
2812 | - | |
2813 | - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rsa", &z_bbcode_parser, &tag_name, &tag_len, &bbcode_entry) == FAILURE) { | |
2814 | - RETURN_NULL(); | |
2815 | - } | |
2816 | + int tag_name_len; | |
2817 | + | |
2818 | + /* tag_definition is an array with these elements: | |
2819 | + | |
2820 | + - required: | |
2821 | + o 'type' => Type of the tag (view BBCODE_TYPE_* to view available tags) | |
2822 | + | |
2823 | + - optional: | |
2824 | + o 'flags' =0 => features of the tag (view BBCODE_FLAGS_* to view capacities) | |
2825 | + o 'open_tag' = '' => the replacement open_tag (1) | |
2826 | + o 'close_tag' = '' => the replacement close_tag (1) | |
2827 | + o 'default_argument' = '' => For Optionnal argument tags argument taken if not given [1] | |
2828 | + o 'content_handling' = '' => Function name called as callback for content ( string new_content content_function ( content, param ); ) | |
2829 | + o 'param_handling' = '' => Function name called as callback for content ( string new_content content_function ( content, param ); ) | |
2830 | + o 'childs' = 'all' => Comma separated list of accepted childs (use !list to make a list of non accepted childs, no space between tag_names) | |
2831 | + o 'parents' = 'all' => Comma separated list of tags of which this tag could be a child | |
2832 | + | |
2833 | + [1] note that the {CONTENT} string is automatically replaced by the content of the tag and {PARAM} by the parameter | |
2834 | + */ | |
2835 | + | |
2836 | + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rsa", &z_bbcode_parser, &tag_name, &tag_name_len, &bbcode_entry) == FAILURE) { | |
2837 | + RETURN_NULL(); | |
2838 | + } | |
2839 | + | |
2840 | ZEND_FETCH_RESOURCE(parser, bbcode_parser_p, &z_bbcode_parser, -1, PHP_BBCODE_RES_NAME, le_bbcode); | |
2841 | - _php_bbcode_add_element(parser, tag_name, bbcode_entry TSRMLS_CC); | |
2842 | + _php_bbcode_add_element(parser, tag_name, tag_name_len, bbcode_entry TSRMLS_CC); | |
2843 | RETURN_TRUE; | |
2844 | } | |
2845 | /* }}} */ | |
2846 | + | |
2847 | /* {{{ proto boolean bbcode_destroy(resource bbcode_container) | |
2848 | - free memory resources of the given bbcode_container */ | |
2849 | -PHP_FUNCTION(bbcode_destroy) | |
2850 | + Frees memory resources of the given bbcode_container. */ | |
2851 | +static PHP_FUNCTION(bbcode_destroy) | |
2852 | { | |
2853 | zval *z_bbcode_parser; | |
2854 | - | |
2855 | + | |
2856 | if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r", &z_bbcode_parser) == FAILURE) { | |
2857 | - RETURN_NULL(); | |
2858 | - } | |
2859 | - | |
2860 | + RETURN_NULL(); | |
2861 | + } | |
2862 | + | |
2863 | RETURN_BOOL(zend_list_delete(Z_LVAL_P(z_bbcode_parser)) == SUCCESS); | |
2864 | } | |
2865 | /* }}} */ | |
2866 | + | |
2867 | /* {{{ proto string bbcode_parse(resource bbcode_container, string to_parse) | |
2868 | - returns the bbcode parsed value of the to_parse string with definitions given by bbcode_container */ | |
2869 | -PHP_FUNCTION(bbcode_parse) | |
2870 | + Returns the bbcode parsed value of the to_parse string with definitions given by bbcode_container. */ | |
2871 | +static PHP_FUNCTION(bbcode_parse) | |
2872 | { | |
2873 | zval *z_bbcode_parser; | |
2874 | bbcode_parser_p parser; | |
2875 | @@ -518,101 +491,165 @@ | |
2876 | int str_len; | |
2877 | char *ret_string; | |
2878 | int ret_size; | |
2879 | - | |
2880 | + | |
2881 | if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rs", &z_bbcode_parser, &string, &str_len) == FAILURE) { | |
2882 | - RETURN_NULL(); | |
2883 | - } | |
2884 | + RETURN_NULL(); | |
2885 | + } | |
2886 | + | |
2887 | ZEND_FETCH_RESOURCE(parser, bbcode_parser_p, &z_bbcode_parser, -1, PHP_BBCODE_RES_NAME, le_bbcode); | |
2888 | - /* converting string for bbcode_parse_string usage */ | |
2889 | - ret_string=bbcode_parse(parser, string, str_len, &ret_size); | |
2890 | - | |
2891 | + | |
2892 | + /* convert string for bbcode_parse_string usage */ | |
2893 | + ret_string = bbcode_parse(parser, string, str_len, &ret_size); | |
2894 | + | |
2895 | RETVAL_STRINGL(ret_string, ret_size , 1); | |
2896 | free(ret_string); | |
2897 | } | |
2898 | /* }}} */ | |
2899 | + | |
2900 | /* {{{ proto boolean bbcode_add_smiley(resource bbcode_container, string find, string replace) | |
2901 | - add a smiley find and replace ruleset */ | |
2902 | -PHP_FUNCTION(bbcode_add_smiley) | |
2903 | + Adds a smiley to find and replace ruleset. */ | |
2904 | +static PHP_FUNCTION(bbcode_add_smiley) | |
2905 | { | |
2906 | zval *z_bbcode_parser; | |
2907 | char *search, *replace; | |
2908 | int s_len, r_len; | |
2909 | - bbcode_parser_p parser=NULL; | |
2910 | - | |
2911 | + bbcode_parser_p parser = NULL; | |
2912 | + | |
2913 | if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rss", &z_bbcode_parser, &search, &s_len, &replace, &r_len) == FAILURE) { | |
2914 | - RETURN_NULL(); | |
2915 | - } | |
2916 | - | |
2917 | + RETURN_NULL(); | |
2918 | + } | |
2919 | + | |
2920 | ZEND_FETCH_RESOURCE(parser, bbcode_parser_p, &z_bbcode_parser, -1, PHP_BBCODE_RES_NAME, le_bbcode); | |
2921 | - | |
2922 | + | |
2923 | bbcode_parser_add_smiley(parser, search, s_len, replace, r_len); | |
2924 | RETURN_BOOL(SUCCESS); | |
2925 | } | |
2926 | /* }}} */ | |
2927 | + | |
2928 | /* {{{ proto boolean bbcode_set_flags(resource bbcode_container, long flag, long mode) | |
2929 | - manage flags on parser using BBCODE_SET_FLAGS_* */ | |
2930 | -PHP_FUNCTION(bbcode_set_flags) | |
2931 | + Set flags on parser using BBCODE_SET_FLAGS_* constants. */ | |
2932 | +static PHP_FUNCTION(bbcode_set_flags) | |
2933 | { | |
2934 | zval *z_bbcode_parser; | |
2935 | long new_flags; | |
2936 | - long mode=0; | |
2937 | + long mode = 0; | |
2938 | long flags; | |
2939 | bbcode_parser_p parser=NULL; | |
2940 | - | |
2941 | + | |
2942 | if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rl|l", &z_bbcode_parser, &new_flags, &mode) == FAILURE) { | |
2943 | - RETURN_NULL(); | |
2944 | - } | |
2945 | - | |
2946 | + RETURN_NULL(); | |
2947 | + } | |
2948 | + | |
2949 | ZEND_FETCH_RESOURCE(parser, bbcode_parser_p, &z_bbcode_parser, -1, PHP_BBCODE_RES_NAME, le_bbcode); | |
2950 | - | |
2951 | - flags=bbcode_parser_get_flags(parser); | |
2952 | - switch (mode){ | |
2953 | + | |
2954 | + flags = bbcode_parser_get_flags(parser); | |
2955 | + | |
2956 | + switch (mode) { | |
2957 | case BBCODE_SET_FLAGS_ADD: | |
2958 | bbcode_parser_set_flags(parser, flags | new_flags); | |
2959 | break; | |
2960 | - | |
2961 | + | |
2962 | case BBCODE_SET_FLAGS_REMOVE: | |
2963 | bbcode_parser_set_flags(parser, flags & (~new_flags)); | |
2964 | break; | |
2965 | - | |
2966 | + | |
2967 | default: | |
2968 | case BBCODE_SET_FLAGS_SET: | |
2969 | bbcode_parser_set_flags(parser, new_flags); | |
2970 | break; | |
2971 | - | |
2972 | } | |
2973 | - | |
2974 | + | |
2975 | RETURN_BOOL(SUCCESS); | |
2976 | } | |
2977 | /* }}} */ | |
2978 | + | |
2979 | /* {{{ proto boolean bbcode_set_arg_parser(resource bbcode_container, resource bbcode_child) | |
2980 | - Sets a bbcode_argument_parser */ | |
2981 | -PHP_FUNCTION(bbcode_set_arg_parser) | |
2982 | + Defines a bbcode_argument_parser. */ | |
2983 | +static PHP_FUNCTION(bbcode_set_arg_parser) | |
2984 | { | |
2985 | zval *z_bbcode_parser; | |
2986 | zval *z_bbcode_parser_child; | |
2987 | - bbcode_parser_p parser=NULL; | |
2988 | - bbcode_parser_p arg_parser=NULL; | |
2989 | - | |
2990 | + bbcode_parser_p parser = NULL; | |
2991 | + bbcode_parser_p arg_parser = NULL; | |
2992 | + | |
2993 | if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rr", &z_bbcode_parser, &z_bbcode_parser_child) == FAILURE) { | |
2994 | - RETURN_NULL(); | |
2995 | - } | |
2996 | + RETURN_NULL(); | |
2997 | + } | |
2998 | + | |
2999 | ZEND_FETCH_RESOURCE(parser, bbcode_parser_p, &z_bbcode_parser, -1, PHP_BBCODE_RES_NAME, le_bbcode); | |
3000 | ZEND_FETCH_RESOURCE(arg_parser, bbcode_parser_p, &z_bbcode_parser_child, -1, PHP_BBCODE_RES_NAME, le_bbcode); | |
3001 | - bbcode_parser_set_arg_parser(parser, arg_parser); | |
3002 | + | |
3003 | + bbcode_parser_set_arg_parser(parser, arg_parser); | |
3004 | + | |
3005 | RETURN_BOOL(SUCCESS); | |
3006 | } | |
3007 | /* }}} */ | |
3008 | ||
3009 | -/*** Module Infos ***/ | |
3010 | -PHP_MINFO_FUNCTION(bbcode) | |
3011 | +/* {{{ Module Info */ | |
3012 | +static PHP_MINFO_FUNCTION(bbcode) | |
3013 | { | |
3014 | php_info_print_table_start(); | |
3015 | php_info_print_table_header(2, "BBCode support", "enabled"); | |
3016 | - php_info_print_table_row(2, "BBCode Version Support", PHP_BBCODE_VERSION); | |
3017 | + php_info_print_table_row(2, "BBCode Extension Version", PHP_BBCODE_VERSION); | |
3018 | php_info_print_table_row(2, "BBCode Library Version", BBCODE_LIB_VERSION); | |
3019 | php_info_print_table_row(2, "BBCode Max Stack Size", "Dynamic"); | |
3020 | php_info_print_table_row(2, "BBCode Max Elements", "No Limit"); | |
3021 | - php_info_print_table_header(1, "This extension makes use of Bstrlib available at http://bstrlib.sf.net"); | |
3022 | php_info_print_table_end(); | |
3023 | + php_info_print_box_start(0); | |
3024 | + PUTS("This extension makes use of Bstrlib available at http://bstrlib.sf.net"); | |
3025 | + php_info_print_box_end(); | |
3026 | } | |
3027 | +/* }}} */ | |
3028 | + | |
3029 | +static zend_function_entry bbcode_functions[] = { /* {{{ */ | |
3030 | + PHP_FE(bbcode_create, NULL) | |
3031 | + PHP_FE(bbcode_add_element, NULL) | |
3032 | + PHP_FE(bbcode_destroy, NULL) | |
3033 | + PHP_FE(bbcode_parse, NULL) | |
3034 | + PHP_FE(bbcode_add_smiley, NULL) | |
3035 | + PHP_FE(bbcode_set_flags, NULL) | |
3036 | + PHP_FE(bbcode_set_arg_parser, NULL) | |
3037 | + {NULL, NULL, NULL} | |
3038 | +}; | |
3039 | +/* }}} */ | |
3040 | + | |
3041 | +#if Void_0 | |
3042 | +/* Object Part, working on it */ | |
3043 | +zend_function_entry bbcode_funcs_object[] = { | |
3044 | + PHP_ME_MAPPING(__construct, bbcode_create, NULL, 0) | |
3045 | + PHP_ME_MAPPING(addElement, bbcode_add_element, NULL, 0) | |
3046 | + PHP_ME_MAPPING(destroy, bbcode_destroy, NULL, 0) | |
3047 | + PHP_ME_MAPPING(parse, bbcode_parse, NULL, 0) | |
3048 | + {NULL, NULL, NULL} | |
3049 | +}; | |
3050 | +#endif | |
3051 | + | |
3052 | +zend_module_entry bbcode_module_entry = { | |
3053 | +#if ZEND_MODULE_API_NO >= 20010901 | |
3054 | + STANDARD_MODULE_HEADER, | |
3055 | +#endif | |
3056 | + PHP_BBCODE_EXTNAME, | |
3057 | + bbcode_functions, | |
3058 | + PHP_MINIT(bbcode), | |
3059 | + NULL, | |
3060 | + NULL, | |
3061 | + NULL, | |
3062 | + PHP_MINFO(bbcode), | |
3063 | +#if ZEND_MODULE_API_NO >= 20010901 | |
3064 | + PHP_BBCODE_VERSION, | |
3065 | +#endif | |
3066 | + STANDARD_MODULE_PROPERTIES | |
3067 | +}; | |
3068 | + | |
3069 | +#ifdef COMPILE_DL_BBCODE | |
3070 | +ZEND_GET_MODULE(bbcode) | |
3071 | +#endif | |
3072 | + | |
3073 | +/* | |
3074 | + * Local variables: | |
3075 | + * tab-width: 4 | |
3076 | + * c-basic-offset: 4 | |
3077 | + * End: | |
3078 | + * vim600: noet sw=4 ts=4 fdm=marker | |
3079 | + * vim<600: noet sw=4 ts=4 | |
3080 | + */ | |
3081 | ||
3082 | Property changes on: php_bbcode.c | |
3083 | ___________________________________________________________________ | |
3084 | Modified: cvs2svn:cvs-rev | |
3085 | - 1.25 | |
3086 | + 1.30 | |
3087 | ||
3088 | Index: php_bbcode.h | |
3089 | =================================================================== | |
3090 | --- php_bbcode.h (.../tags/RELEASE_1_0_2) | |
3091 | +++ php_bbcode.h (.../trunk) | |
3092 | @@ -2,7 +2,7 @@ | |
3093 | +----------------------------------------------------------------------+ | |
3094 | | PHP Version 5 | | |
3095 | +----------------------------------------------------------------------+ | |
3096 | - | Copyright (c) 1997-2007 The PHP Group | | |
3097 | + | Copyright (c) 1997-2008 The PHP Group | | |
3098 | +----------------------------------------------------------------------+ | |
3099 | | This source file is subject to version 3.01 of the PHP license, | | |
3100 | | that is bundled with this package in the file LICENSE, and is | | |
3101 | @@ -14,32 +14,31 @@ | |
3102 | +----------------------------------------------------------------------+ | |
3103 | | Author: Xavier De Cock <void@php.net> | | |
3104 | +----------------------------------------------------------------------+ | |
3105 | - | |
3106 | - $Id$ | |
3107 | */ | |
3108 | + | |
3109 | +/* $Id$ */ | |
3110 | + | |
3111 | #ifndef PHP_BBCODE_H | |
3112 | -#define PHP_BBCODE_H 1 | |
3113 | +#define PHP_BBCODE_H | |
3114 | ||
3115 | -#define PHP_BBCODE_VERSION "1.0.2" | |
3116 | +#define PHP_BBCODE_VERSION "1.1.0-dev" | |
3117 | #define PHP_BBCODE_EXTNAME "bbcode" | |
3118 | +#define PHP_BBCODE_RES_NAME "BBCode resource" | |
3119 | ||
3120 | #define BBCODE_SET_FLAGS_SET 0 | |
3121 | #define BBCODE_SET_FLAGS_ADD 1 | |
3122 | #define BBCODE_SET_FLAGS_REMOVE 2 | |
3123 | ||
3124 | -PHP_MINIT_FUNCTION(bbcode); | |
3125 | -PHP_MINFO_FUNCTION(bbcode); | |
3126 | -PHP_FUNCTION(bbcode_create); | |
3127 | -PHP_FUNCTION(bbcode_add_element); | |
3128 | -PHP_FUNCTION(bbcode_destroy); | |
3129 | -PHP_FUNCTION(bbcode_parse); | |
3130 | -PHP_FUNCTION(bbcode_add_smiley); | |
3131 | -PHP_FUNCTION(bbcode_set_flags); | |
3132 | -PHP_FUNCTION(bbcode_set_arg_parser); | |
3133 | - | |
3134 | extern zend_module_entry bbcode_module_entry; | |
3135 | #define phpext_bbcode_ptr &bbcode_module_entry | |
3136 | ||
3137 | -#define PHP_BBCODE_RES_NAME "BBCode resource" | |
3138 | - | |
3139 | #endif | |
3140 | + | |
3141 | +/* | |
3142 | + * Local variables: | |
3143 | + * tab-width: 4 | |
3144 | + * c-basic-offset: 4 | |
3145 | + * End: | |
3146 | + * vim600: noet sw=4 ts=4 fdm=marker | |
3147 | + * vim<600: noet sw=4 ts=4 | |
3148 | + */ | |
3149 | ||
3150 | Property changes on: php_bbcode.h | |
3151 | ___________________________________________________________________ | |
3152 | Modified: cvs2svn:cvs-rev | |
3153 | - 1.13 | |
3154 | + 1.14 | |
3155 | ||
3156 | ||
3157 | Property changes on: . | |
3158 | ___________________________________________________________________ | |
3159 | Added: svn:ignore | |
3160 | + .deps | |
3161 | Makefile | |
3162 | *.lo | |
3163 | *.loT | |
3164 | *.slo | |
3165 | *.mk | |
3166 | *.la | |
3167 | .libs | |
3168 | libs.mk | |
3169 | ac*.m4 | |
3170 | build | |
3171 | config.h | |
3172 | config.h.in | |
3173 | config.nice | |
3174 | config.sub | |
3175 | configure | |
3176 | configure.in | |
3177 | config.status | |
3178 | config.cache | |
3179 | conftest | |
3180 | conftest.c | |
3181 | core | |
3182 | dynlib.m4 | |
3183 | install-sh | |
3184 | ltmain.sh | |
3185 | include | |
3186 | Makefile.fragments | |
3187 | Makefile.global | |
3188 | Makefile.objects | |
3189 | missing | |
3190 | mkinstalldirs | |
3191 | modules | |
3192 | scan_makefile_in.awk | |
3193 | config.guess | |
3194 | *swp | |
3195 | config.log | |
3196 | libtool | |
3197 | Debug | |
3198 | Release | |
3199 | Debug_TS | |
3200 | Release_TS | |
3201 | *.plg | |
3202 | *.patch | |
3203 | *.tgz | |
3204 | *.ncb | |
3205 | *.opt | |
3206 | *.dsw | |
3207 | autom4te.cache | |
3208 | run-tests-config.php | |
3209 | run-tests.php | |
3210 | ||
3211 |