colonymech / docs / www / colonyscout / internal / jeditable / php / Textile.php @ f59acf11
History | View | Annotate | Download (37.9 KB)
1 |
<?php
|
---|---|
2 |
|
3 |
/**
|
4 |
* Example: get XHTML from a given Textile-markup string ($string)
|
5 |
*
|
6 |
* $textile = new Textile;
|
7 |
* echo $textile->TextileThis($string);
|
8 |
*
|
9 |
*/
|
10 |
|
11 |
/*
|
12 |
$Id: Textile.php,v 1.2 2006/12/11 10:18:59 toni Exp $
|
13 |
$LastChangedRevision: 1998 $
|
14 |
*/
|
15 |
|
16 |
/*
|
17 |
|
18 |
_____________
|
19 |
T E X T I L E
|
20 |
|
21 |
A Humane Web Text Generator
|
22 |
|
23 |
Version 2.0
|
24 |
|
25 |
Copyright (c) 2003-2004, Dean Allen <dean@textism.com>
|
26 |
All rights reserved.
|
27 |
|
28 |
Thanks to Carlo Zottmann <carlo@g-blog.net> for refactoring
|
29 |
Textile's procedural code into a class framework
|
30 |
|
31 |
Additions and fixes Copyright (c) 2006 Alex Shiels http://thresholdstate.com/
|
32 |
|
33 |
_____________
|
34 |
L I C E N S E
|
35 |
|
36 |
Redistribution and use in source and binary forms, with or without
|
37 |
modification, are permitted provided that the following conditions are met:
|
38 |
|
39 |
* Redistributions of source code must retain the above copyright notice,
|
40 |
this list of conditions and the following disclaimer.
|
41 |
|
42 |
* Redistributions in binary form must reproduce the above copyright notice,
|
43 |
this list of conditions and the following disclaimer in the documentation
|
44 |
and/or other materials provided with the distribution.
|
45 |
|
46 |
* Neither the name Textile nor the names of its contributors may be used to
|
47 |
endorse or promote products derived from this software without specific
|
48 |
prior written permission.
|
49 |
|
50 |
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
51 |
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
52 |
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
53 |
ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
54 |
LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
55 |
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
56 |
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
57 |
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
58 |
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
59 |
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
60 |
POSSIBILITY OF SUCH DAMAGE.
|
61 |
|
62 |
_________
|
63 |
U S A G E
|
64 |
|
65 |
Block modifier syntax:
|
66 |
|
67 |
Header: h(1-6).
|
68 |
Paragraphs beginning with 'hn. ' (where n is 1-6) are wrapped in header tags.
|
69 |
Example: h1. Header... -> <h1>Header...</h1>
|
70 |
|
71 |
Paragraph: p. (also applied by default)
|
72 |
Example: p. Text -> <p>Text</p>
|
73 |
|
74 |
Blockquote: bq.
|
75 |
Example: bq. Block quotation... -> <blockquote>Block quotation...</blockquote>
|
76 |
|
77 |
Blockquote with citation: bq.:http://citation.url
|
78 |
Example: bq.:http://textism.com/ Text...
|
79 |
-> <blockquote cite="http://textism.com">Text...</blockquote>
|
80 |
|
81 |
Footnote: fn(1-100).
|
82 |
Example: fn1. Footnote... -> <p id="fn1">Footnote...</p>
|
83 |
|
84 |
Numeric list: #, ##
|
85 |
Consecutive paragraphs beginning with # are wrapped in ordered list tags.
|
86 |
Example: <ol><li>ordered list</li></ol>
|
87 |
|
88 |
Bulleted list: *, **
|
89 |
Consecutive paragraphs beginning with * are wrapped in unordered list tags.
|
90 |
Example: <ul><li>unordered list</li></ul>
|
91 |
|
92 |
Phrase modifier syntax:
|
93 |
|
94 |
_emphasis_ -> <em>emphasis</em>
|
95 |
__italic__ -> <i>italic</i>
|
96 |
*strong* -> <strong>strong</strong>
|
97 |
**bold** -> <b>bold</b>
|
98 |
??citation?? -> <cite>citation</cite>
|
99 |
-deleted text- -> <del>deleted</del>
|
100 |
+inserted text+ -> <ins>inserted</ins>
|
101 |
^superscript^ -> <sup>superscript</sup>
|
102 |
~subscript~ -> <sub>subscript</sub>
|
103 |
@code@ -> <code>computer code</code>
|
104 |
%(bob)span% -> <span class="bob">span</span>
|
105 |
|
106 |
==notextile== -> leave text alone (do not format)
|
107 |
|
108 |
"linktext":url -> <a href="url">linktext</a>
|
109 |
"linktext(title)":url -> <a href="url" title="title">linktext</a>
|
110 |
|
111 |
!imageurl! -> <img src="imageurl" />
|
112 |
!imageurl(alt text)! -> <img src="imageurl" alt="alt text" />
|
113 |
!imageurl!:linkurl -> <a href="linkurl"><img src="imageurl" /></a>
|
114 |
|
115 |
ABC(Always Be Closing) -> <acronym title="Always Be Closing">ABC</acronym>
|
116 |
|
117 |
|
118 |
Table syntax:
|
119 |
|
120 |
Simple tables:
|
121 |
|
122 |
|a|simple|table|row|
|
123 |
|And|Another|table|row|
|
124 |
|
125 |
|_. A|_. table|_. header|_.row|
|
126 |
|A|simple|table|row|
|
127 |
|
128 |
Tables with attributes:
|
129 |
|
130 |
table{border:1px solid black}.
|
131 |
{background:#ddd;color:red}. |{}| | | |
|
132 |
|
133 |
|
134 |
Applying Attributes:
|
135 |
|
136 |
Most anywhere Textile code is used, attributes such as arbitrary css style,
|
137 |
css classes, and ids can be applied. The syntax is fairly consistent.
|
138 |
|
139 |
The following characters quickly alter the alignment of block elements:
|
140 |
|
141 |
< -> left align ex. p<. left-aligned para
|
142 |
> -> right align h3>. right-aligned header 3
|
143 |
= -> centred h4=. centred header 4
|
144 |
<> -> justified p<>. justified paragraph
|
145 |
|
146 |
These will change vertical alignment in table cells:
|
147 |
|
148 |
^ -> top ex. |^. top-aligned table cell|
|
149 |
- -> middle |-. middle aligned|
|
150 |
~ -> bottom |~. bottom aligned cell|
|
151 |
|
152 |
Plain (parentheses) inserted between block syntax and the closing dot-space
|
153 |
indicate classes and ids:
|
154 |
|
155 |
p(hector). paragraph -> <p class="hector">paragraph</p>
|
156 |
|
157 |
p(#fluid). paragraph -> <p id="fluid">paragraph</p>
|
158 |
|
159 |
(classes and ids can be combined)
|
160 |
p(hector#fluid). paragraph -> <p class="hector" id="fluid">paragraph</p>
|
161 |
|
162 |
Curly {brackets} insert arbitrary css style
|
163 |
|
164 |
p{line-height:18px}. paragraph -> <p style="line-height:18px">paragraph</p>
|
165 |
|
166 |
h3{color:red}. header 3 -> <h3 style="color:red">header 3</h3>
|
167 |
|
168 |
Square [brackets] insert language attributes
|
169 |
|
170 |
p[no]. paragraph -> <p lang="no">paragraph</p>
|
171 |
|
172 |
%[fr]phrase% -> <span lang="fr">phrase</span>
|
173 |
|
174 |
Usually Textile block element syntax requires a dot and space before the block
|
175 |
begins, but since lists don't, they can be styled just using braces
|
176 |
|
177 |
#{color:blue} one -> <ol style="color:blue">
|
178 |
# big <li>one</li>
|
179 |
# list <li>big</li>
|
180 |
<li>list</li>
|
181 |
</ol>
|
182 |
|
183 |
Using the span tag to style a phrase
|
184 |
|
185 |
It goes like this, %{color:red}the fourth the fifth%
|
186 |
-> It goes like this, <span style="color:red">the fourth the fifth</span>
|
187 |
|
188 |
*/
|
189 |
|
190 |
// define these before including this file to override the standard glyphs
|
191 |
@define('txt_quote_single_open', '‘'); |
192 |
@define('txt_quote_single_close', '’'); |
193 |
@define('txt_quote_double_open', '“'); |
194 |
@define('txt_quote_double_close', '”'); |
195 |
@define('txt_apostrophe', '’'); |
196 |
@define('txt_prime', '′'); |
197 |
@define('txt_prime_double', '″'); |
198 |
@define('txt_ellipsis', '…'); |
199 |
@define('txt_emdash', '—'); |
200 |
@define('txt_endash', '–'); |
201 |
@define('txt_dimension', '×'); |
202 |
@define('txt_trademark', '™'); |
203 |
@define('txt_registered', '®'); |
204 |
@define('txt_copyright', '©'); |
205 |
|
206 |
class Textile |
207 |
{ |
208 |
var $hlgn; |
209 |
var $vlgn; |
210 |
var $clas; |
211 |
var $lnge; |
212 |
var $styl; |
213 |
var $cspn; |
214 |
var $rspn; |
215 |
var $a; |
216 |
var $s; |
217 |
var $c; |
218 |
var $pnct; |
219 |
var $rel; |
220 |
var $fn; |
221 |
|
222 |
var $shelf = array(); |
223 |
var $restricted = false; |
224 |
var $noimage = false; |
225 |
var $lite = false; |
226 |
var $url_schemes = array(); |
227 |
var $glyph = array(); |
228 |
var $hu = ''; |
229 |
|
230 |
var $ver = '2.0.0'; |
231 |
var $rev = '$Rev: 1998 $'; |
232 |
|
233 |
var $doc_root; |
234 |
|
235 |
// -------------------------------------------------------------
|
236 |
function Textile() |
237 |
{ |
238 |
$this->hlgn = "(?:\<(?!>)|(?<!<)\>|\<\>|\=|[()]+(?! ))"; |
239 |
$this->vlgn = "[\-^~]"; |
240 |
$this->clas = "(?:\([^)]+\))"; |
241 |
$this->lnge = "(?:\[[^]]+\])"; |
242 |
$this->styl = "(?:\{[^}]+\})"; |
243 |
$this->cspn = "(?:\\\\\d+)"; |
244 |
$this->rspn = "(?:\/\d+)"; |
245 |
$this->a = "(?:{$this->hlgn}|{$this->vlgn})*"; |
246 |
$this->s = "(?:{$this->cspn}|{$this->rspn})*"; |
247 |
$this->c = "(?:{$this->clas}|{$this->styl}|{$this->lnge}|{$this->hlgn})*"; |
248 |
|
249 |
$this->pnct = '[\!"#\$%&\'()\*\+,\-\./:;<=>\?@\[\\\]\^_`{\|}\~]'; |
250 |
$this->urlch = '[\w"$\-_.+!*\'(),";\/?:@=&%#{}|\\^~\[\]`]'; |
251 |
|
252 |
$this->url_schemes = array('http','https','ftp','mailto'); |
253 |
|
254 |
$this->btag = array('bq', 'bc', 'notextile', 'pre', 'h[1-6]', 'fn\d+', 'p'); |
255 |
|
256 |
$this->glyph = array( |
257 |
'quote_single_open' => txt_quote_single_open,
|
258 |
'quote_single_close' => txt_quote_single_close,
|
259 |
'quote_double_open' => txt_quote_double_open,
|
260 |
'quote_double_close' => txt_quote_double_close,
|
261 |
'apostrophe' => txt_apostrophe,
|
262 |
'prime' => txt_prime,
|
263 |
'prime_double' => txt_prime_double,
|
264 |
'ellipsis' => txt_ellipsis,
|
265 |
'emdash' => txt_emdash,
|
266 |
'endash' => txt_endash,
|
267 |
'dimension' => txt_dimension,
|
268 |
'trademark' => txt_trademark,
|
269 |
'registered' => txt_registered,
|
270 |
'copyright' => txt_copyright,
|
271 |
); |
272 |
|
273 |
if (defined('hu')) |
274 |
$this->hu = hu;
|
275 |
|
276 |
if (defined('DIRECTORY_SEPARATOR')) |
277 |
$this->ds = constant('DIRECTORY_SEPARATOR'); |
278 |
else
|
279 |
$this->ds = '/'; |
280 |
|
281 |
$this->doc_root = @$_SERVER['DOCUMENT_ROOT']; |
282 |
if (!$this->doc_root) |
283 |
$this->doc_root = @$_SERVER['PATH_TRANSLATED']; // IIS |
284 |
|
285 |
$this->doc_root = rtrim($this->doc_root, $this->ds).$this->ds; |
286 |
|
287 |
} |
288 |
|
289 |
// -------------------------------------------------------------
|
290 |
|
291 |
function TextileThis($text, $lite = '', $encode = '', $noimage = '', $strict = '', $rel = '') |
292 |
{ |
293 |
$this->rel = ($rel) ? ' rel="'.$rel.'"' : ''; |
294 |
|
295 |
$this->lite = $lite; |
296 |
$this->noimage = $noimage; |
297 |
|
298 |
if ($encode) { |
299 |
$text = $this->incomingEntities($text); |
300 |
$text = str_replace("x%x%", "&", $text); |
301 |
return $text; |
302 |
} else {
|
303 |
|
304 |
if(!$strict) { |
305 |
$text = $this->cleanWhiteSpace($text); |
306 |
} |
307 |
|
308 |
$text = $this->getRefs($text); |
309 |
|
310 |
if (!$lite) { |
311 |
$text = $this->block($text); |
312 |
} |
313 |
|
314 |
$text = $this->retrieve($text); |
315 |
|
316 |
// just to be tidy
|
317 |
$text = str_replace("<br />", "<br />\n", $text); |
318 |
|
319 |
return $text; |
320 |
} |
321 |
} |
322 |
|
323 |
// -------------------------------------------------------------
|
324 |
|
325 |
function TextileRestricted($text, $lite = 1, $noimage = 1, $rel = 'nofollow') |
326 |
{ |
327 |
$this->restricted = true; |
328 |
$this->lite = $lite; |
329 |
$this->noimage = $noimage; |
330 |
|
331 |
$this->rel = ($rel) ? ' rel="'.$rel.'"' : ''; |
332 |
|
333 |
// escape any raw html
|
334 |
$text = $this->encode_html($text, 0); |
335 |
|
336 |
$text = $this->cleanWhiteSpace($text); |
337 |
$text = $this->getRefs($text); |
338 |
|
339 |
if ($lite) { |
340 |
$text = $this->blockLite($text); |
341 |
} |
342 |
else {
|
343 |
$text = $this->block($text); |
344 |
} |
345 |
|
346 |
$text = $this->retrieve($text); |
347 |
|
348 |
// just to be tidy
|
349 |
$text = str_replace("<br />", "<br />\n", $text); |
350 |
|
351 |
return $text; |
352 |
} |
353 |
|
354 |
// -------------------------------------------------------------
|
355 |
function pba($in, $element = "") // "parse block attributes" |
356 |
{ |
357 |
$style = ''; |
358 |
$class = ''; |
359 |
$lang = ''; |
360 |
$colspan = ''; |
361 |
$rowspan = ''; |
362 |
$id = ''; |
363 |
$atts = ''; |
364 |
|
365 |
if (!empty($in)) { |
366 |
$matched = $in; |
367 |
if ($element == 'td') { |
368 |
if (preg_match("/\\\\(\d+)/", $matched, $csp)) $colspan = $csp[1]; |
369 |
if (preg_match("/\/(\d+)/", $matched, $rsp)) $rowspan = $rsp[1]; |
370 |
} |
371 |
|
372 |
if ($element == 'td' or $element == 'tr') { |
373 |
if (preg_match("/($this->vlgn)/", $matched, $vert)) |
374 |
$style[] = "vertical-align:" . $this->vAlign($vert[1]) . ";"; |
375 |
} |
376 |
|
377 |
if (preg_match("/\{([^}]*)\}/", $matched, $sty)) { |
378 |
$style[] = rtrim($sty[1], ';') . ';'; |
379 |
$matched = str_replace($sty[0], '', $matched); |
380 |
} |
381 |
|
382 |
if (preg_match("/\[([^]]+)\]/U", $matched, $lng)) { |
383 |
$lang = $lng[1]; |
384 |
$matched = str_replace($lng[0], '', $matched); |
385 |
} |
386 |
|
387 |
if (preg_match("/\(([^()]+)\)/U", $matched, $cls)) { |
388 |
$class = $cls[1]; |
389 |
$matched = str_replace($cls[0], '', $matched); |
390 |
} |
391 |
|
392 |
if (preg_match("/([(]+)/", $matched, $pl)) { |
393 |
$style[] = "padding-left:" . strlen($pl[1]) . "em;"; |
394 |
$matched = str_replace($pl[0], '', $matched); |
395 |
} |
396 |
|
397 |
if (preg_match("/([)]+)/", $matched, $pr)) { |
398 |
// $this->dump($pr);
|
399 |
$style[] = "padding-right:" . strlen($pr[1]) . "em;"; |
400 |
$matched = str_replace($pr[0], '', $matched); |
401 |
} |
402 |
|
403 |
if (preg_match("/($this->hlgn)/", $matched, $horiz)) |
404 |
$style[] = "text-align:" . $this->hAlign($horiz[1]) . ";"; |
405 |
|
406 |
if (preg_match("/^(.*)#(.*)$/", $class, $ids)) { |
407 |
$id = $ids[2]; |
408 |
$class = $ids[1]; |
409 |
} |
410 |
|
411 |
if ($this->restricted) |
412 |
return ($lang) ? ' lang="' . $lang .'"':''; |
413 |
|
414 |
return join('',array( |
415 |
($style) ? ' style="' . join("", $style) .'"':'', |
416 |
($class) ? ' class="' . $class .'"':'', |
417 |
($lang) ? ' lang="' . $lang .'"':'', |
418 |
($id) ? ' id="' . $id .'"':'', |
419 |
($colspan) ? ' colspan="' . $colspan .'"':'', |
420 |
($rowspan) ? ' rowspan="' . $rowspan .'"':'' |
421 |
)); |
422 |
} |
423 |
return ''; |
424 |
} |
425 |
|
426 |
// -------------------------------------------------------------
|
427 |
function hasRawText($text) |
428 |
{ |
429 |
// checks whether the text has text not already enclosed by a block tag
|
430 |
$r = trim(preg_replace('@<(p|blockquote|div|form|table|ul|ol|pre|h\d)[^>]*?>.*</\1>@s', '', trim($text))); |
431 |
$r = trim(preg_replace('@<(hr|br)[^>]*?/>@', '', $r)); |
432 |
return '' != $r; |
433 |
} |
434 |
|
435 |
// -------------------------------------------------------------
|
436 |
function table($text) |
437 |
{ |
438 |
$text = $text . "\n\n"; |
439 |
return preg_replace_callback("/^(?:table(_?{$this->s}{$this->a}{$this->c})\. ?\n)?^({$this->a}{$this->c}\.? ?\|.*\|)\n\n/smU", |
440 |
array(&$this, "fTable"), $text); |
441 |
} |
442 |
|
443 |
// -------------------------------------------------------------
|
444 |
function fTable($matches) |
445 |
{ |
446 |
$tatts = $this->pba($matches[1], 'table'); |
447 |
|
448 |
foreach(preg_split("/\|$/m", $matches[2], -1, PREG_SPLIT_NO_EMPTY) as $row) { |
449 |
if (preg_match("/^($this->a$this->c\. )(.*)/m", ltrim($row), $rmtch)) { |
450 |
$ratts = $this->pba($rmtch[1], 'tr'); |
451 |
$row = $rmtch[2]; |
452 |
} else $ratts = ''; |
453 |
|
454 |
$cells = array(); |
455 |
foreach(explode("|", $row) as $cell) { |
456 |
$ctyp = "d"; |
457 |
if (preg_match("/^_/", $cell)) $ctyp = "h"; |
458 |
if (preg_match("/^(_?$this->s$this->a$this->c\. )(.*)/", $cell, $cmtch)) { |
459 |
$catts = $this->pba($cmtch[1], 'td'); |
460 |
$cell = $cmtch[2]; |
461 |
} else $catts = ''; |
462 |
|
463 |
$cell = $this->graf($this->span($cell)); |
464 |
|
465 |
if (trim($cell) != '') |
466 |
$cells[] = "\t\t\t<t$ctyp$catts>$cell</t$ctyp>"; |
467 |
} |
468 |
$rows[] = "\t\t<tr$ratts>\n" . join("\n", $cells) . ($cells ? "\n" : "") . "\t\t</tr>"; |
469 |
unset($cells, $catts); |
470 |
} |
471 |
return "\t<table$tatts>\n" . join("\n", $rows) . "\n\t</table>\n\n"; |
472 |
} |
473 |
|
474 |
// -------------------------------------------------------------
|
475 |
function lists($text) |
476 |
{ |
477 |
return preg_replace_callback("/^([#*]+$this->c .*)$(?![^#*])/smU", array(&$this, "fList"), $text); |
478 |
} |
479 |
|
480 |
// -------------------------------------------------------------
|
481 |
function fList($m) |
482 |
{ |
483 |
$text = explode("\n", $m[0]); |
484 |
foreach($text as $line) { |
485 |
$nextline = next($text); |
486 |
if (preg_match("/^([#*]+)($this->a$this->c) (.*)$/s", $line, $m)) { |
487 |
list(, $tl, $atts, $content) = $m; |
488 |
$nl = ''; |
489 |
if (preg_match("/^([#*]+)\s.*/", $nextline, $nm)) |
490 |
$nl = $nm[1]; |
491 |
if (!isset($lists[$tl])) { |
492 |
$lists[$tl] = true; |
493 |
$atts = $this->pba($atts); |
494 |
$line = "\t<" . $this->lT($tl) . "l$atts>\n\t\t<li>" . $this->graf($content); |
495 |
} else {
|
496 |
$line = "\t\t<li>" . $this->graf($content); |
497 |
} |
498 |
|
499 |
if(strlen($nl) <= strlen($tl)) $line .= "</li>"; |
500 |
foreach(array_reverse($lists) as $k => $v) { |
501 |
if(strlen($k) > strlen($nl)) { |
502 |
$line .= "\n\t</" . $this->lT($k) . "l>"; |
503 |
if(strlen($k) > 1) |
504 |
$line .= "</li>"; |
505 |
unset($lists[$k]); |
506 |
} |
507 |
} |
508 |
} |
509 |
$out[] = $line; |
510 |
} |
511 |
return join("\n", $out); |
512 |
} |
513 |
|
514 |
// -------------------------------------------------------------
|
515 |
function lT($in) |
516 |
{ |
517 |
return preg_match("/^#+/", $in) ? 'o' : 'u'; |
518 |
} |
519 |
|
520 |
// -------------------------------------------------------------
|
521 |
function doPBr($in) |
522 |
{ |
523 |
return preg_replace_callback('@<(p)([^>]*?)>(.*)(</\1>)@s', array(&$this, 'doBr'), $in); |
524 |
} |
525 |
|
526 |
// -------------------------------------------------------------
|
527 |
function doBr($m) |
528 |
{ |
529 |
$content = preg_replace("@(.+)(?<!<br>|<br />)\n(?![#*\s|])@", '$1<br />', $m[3]); |
530 |
return '<'.$m[1].$m[2].'>'.$content.$m[4]; |
531 |
} |
532 |
|
533 |
// -------------------------------------------------------------
|
534 |
function block($text) |
535 |
{ |
536 |
$find = $this->btag; |
537 |
$tre = join('|', $find); |
538 |
|
539 |
$text = explode("\n\n", $text); |
540 |
|
541 |
$tag = 'p'; |
542 |
$atts = $cite = $graf = $ext = ''; |
543 |
|
544 |
foreach($text as $line) { |
545 |
$anon = 0; |
546 |
if (preg_match("/^($tre)($this->a$this->c)\.(\.?)(?::(\S+))? (.*)$/s", $line, $m)) { |
547 |
// last block was extended, so close it
|
548 |
if ($ext) |
549 |
$out[count($out)-1] .= $c1; |
550 |
// new block
|
551 |
list(,$tag,$atts,$ext,$cite,$graf) = $m; |
552 |
list($o1, $o2, $content, $c2, $c1) = $this->fBlock(array(0,$tag,$atts,$ext,$cite,$graf)); |
553 |
|
554 |
// leave off c1 if this block is extended, we'll close it at the start of the next block
|
555 |
if ($ext) |
556 |
$line = $o1.$o2.$content.$c2; |
557 |
else
|
558 |
$line = $o1.$o2.$content.$c2.$c1; |
559 |
} |
560 |
else {
|
561 |
// anonymous block
|
562 |
$anon = 1; |
563 |
if ($ext or !preg_match('/^ /', $line)) { |
564 |
list($o1, $o2, $content, $c2, $c1) = $this->fBlock(array(0,$tag,$atts,$ext,$cite,$line)); |
565 |
// skip $o1/$c1 because this is part of a continuing extended block
|
566 |
if ($tag == 'p' and !$this->hasRawText($content)) { |
567 |
$line = $content; |
568 |
} |
569 |
else {
|
570 |
$line = $o2.$content.$c2; |
571 |
} |
572 |
} |
573 |
else {
|
574 |
$line = $this->graf($line); |
575 |
} |
576 |
} |
577 |
|
578 |
$line = $this->doPBr($line); |
579 |
$line = preg_replace('/<br>/', '<br />', $line); |
580 |
|
581 |
if ($ext and $anon) |
582 |
$out[count($out)-1] .= "\n".$line; |
583 |
else
|
584 |
$out[] = $line; |
585 |
|
586 |
if (!$ext) { |
587 |
$tag = 'p'; |
588 |
$atts = ''; |
589 |
$cite = ''; |
590 |
$graf = ''; |
591 |
} |
592 |
} |
593 |
if ($ext) $out[count($out)-1] .= $c1; |
594 |
return join("\n\n", $out); |
595 |
} |
596 |
|
597 |
|
598 |
|
599 |
// -------------------------------------------------------------
|
600 |
function fBlock($m) |
601 |
{ |
602 |
// $this->dump($m);
|
603 |
list(, $tag, $atts, $ext, $cite, $content) = $m; |
604 |
$atts = $this->pba($atts); |
605 |
|
606 |
$o1 = $o2 = $c2 = $c1 = ''; |
607 |
|
608 |
if (preg_match("/fn(\d+)/", $tag, $fns)) { |
609 |
$tag = 'p'; |
610 |
$fnid = empty($this->fn[$fns[1]]) ? $fns[1] : $this->fn[$fns[1]]; |
611 |
$atts .= ' id="fn' . $fnid . '"'; |
612 |
if (strpos($atts, 'class=') === false) |
613 |
$atts .= ' class="footnote"'; |
614 |
$content = '<sup>' . $fns[1] . '</sup> ' . $content; |
615 |
} |
616 |
|
617 |
if ($tag == "bq") { |
618 |
$cite = $this->checkRefs($cite); |
619 |
$cite = ($cite != '') ? ' cite="' . $cite . '"' : ''; |
620 |
$o1 = "\t<blockquote$cite$atts>\n"; |
621 |
$o2 = "\t\t<p$atts>"; |
622 |
$c2 = "</p>"; |
623 |
$c1 = "\n\t</blockquote>"; |
624 |
} |
625 |
elseif ($tag == 'bc') { |
626 |
$o1 = "<pre$atts>"; |
627 |
$o2 = "<code$atts>"; |
628 |
$c2 = "</code>"; |
629 |
$c1 = "</pre>"; |
630 |
$content = $this->shelve($this->r_encode_html(rtrim($content, "\n")."\n")); |
631 |
} |
632 |
elseif ($tag == 'notextile') { |
633 |
$content = $this->shelve($content); |
634 |
$o1 = $o2 = ''; |
635 |
$c1 = $c2 = ''; |
636 |
} |
637 |
elseif ($tag == 'pre') { |
638 |
$content = $this->shelve($this->r_encode_html(rtrim($content, "\n")."\n")); |
639 |
$o1 = "<pre$atts>"; |
640 |
$o2 = $c2 = ''; |
641 |
$c1 = "</pre>"; |
642 |
} |
643 |
else {
|
644 |
$o2 = "\t<$tag$atts>"; |
645 |
$c2 = "</$tag>"; |
646 |
} |
647 |
|
648 |
$content = $this->graf($content); |
649 |
|
650 |
return array($o1, $o2, $content, $c2, $c1); |
651 |
} |
652 |
|
653 |
// -------------------------------------------------------------
|
654 |
function graf($text) |
655 |
{ |
656 |
// handle normal paragraph text
|
657 |
if (!$this->lite) { |
658 |
$text = $this->noTextile($text); |
659 |
$text = $this->code($text); |
660 |
} |
661 |
|
662 |
$text = $this->links($text); |
663 |
if (!$this->noimage) |
664 |
$text = $this->image($text); |
665 |
|
666 |
if (!$this->lite) { |
667 |
$text = $this->lists($text); |
668 |
$text = $this->table($text); |
669 |
} |
670 |
|
671 |
$text = $this->span($text); |
672 |
$text = $this->footnoteRef($text); |
673 |
$text = $this->glyphs($text); |
674 |
return rtrim($text, "\n"); |
675 |
} |
676 |
|
677 |
// -------------------------------------------------------------
|
678 |
function span($text) |
679 |
{ |
680 |
$qtags = array('\*\*','\*','\?\?','-','__','_','%','\+','~','\^'); |
681 |
$pnct = ".,\"'?!;:"; |
682 |
|
683 |
foreach($qtags as $f) { |
684 |
$text = preg_replace_callback("/ |
685 |
(?:^|(?<=[\s>$pnct\(])|([{[]))
|
686 |
($f)(?!$f)
|
687 |
({$this->c})
|
688 |
(?::(\S+))?
|
689 |
([^\s$f]+|\S.*?[^\s$f\n])
|
690 |
([$pnct]*)
|
691 |
$f
|
692 |
(?:$|([\]}])|(?=[[:punct:]]{1,2}|\s|\)))
|
693 |
/x", array(&$this, "fSpan"), $text); |
694 |
} |
695 |
return $text; |
696 |
} |
697 |
|
698 |
// -------------------------------------------------------------
|
699 |
function fSpan($m) |
700 |
{ |
701 |
$qtags = array( |
702 |
'*' => 'strong', |
703 |
'**' => 'b', |
704 |
'??' => 'cite', |
705 |
'_' => 'em', |
706 |
'__' => 'i', |
707 |
'-' => 'del', |
708 |
'%' => 'span', |
709 |
'+' => 'ins', |
710 |
'~' => 'sub', |
711 |
'^' => 'sup', |
712 |
); |
713 |
|
714 |
list(,, $tag, $atts, $cite, $content, $end) = $m; |
715 |
$tag = $qtags[$tag]; |
716 |
$atts = $this->pba($atts); |
717 |
$atts .= ($cite != '') ? 'cite="' . $cite . '"' : ''; |
718 |
|
719 |
$out = "<$tag$atts>$content$end</$tag>"; |
720 |
|
721 |
// $this->dump($out);
|
722 |
|
723 |
return $out; |
724 |
|
725 |
} |
726 |
|
727 |
// -------------------------------------------------------------
|
728 |
function links($text) |
729 |
{ |
730 |
return preg_replace_callback('/ |
731 |
(?:^|(?<=[\s>.$pnct\(])|([{[])) # $pre
|
732 |
" # start
|
733 |
(' . $this->c . ') # $atts |
734 |
([^"]+) # $text
|
735 |
(?:\(([^)]+)\)(?="))? # $title
|
736 |
":
|
737 |
('.$this->urlch.'+) # $url |
738 |
(\/)? # $slash
|
739 |
([^\w\/;]*) # $post
|
740 |
(?:([\]}])|(?=\s|$|\)))
|
741 |
/Ux', array(&$this, "fLink"), $text); |
742 |
} |
743 |
|
744 |
// -------------------------------------------------------------
|
745 |
function fLink($m) |
746 |
{ |
747 |
list(, $pre, $atts, $text, $title, $url, $slash, $post) = $m; |
748 |
|
749 |
$url = $this->checkRefs($url); |
750 |
|
751 |
$atts = $this->pba($atts); |
752 |
$atts .= ($title != '') ? ' title="' . $this->encode_html($title) . '"' : ''; |
753 |
|
754 |
if (!$this->noimage) |
755 |
$text = $this->image($text); |
756 |
|
757 |
$text = $this->span($text); |
758 |
$text = $this->glyphs($text); |
759 |
|
760 |
$url = $this->relURL($url); |
761 |
|
762 |
$out = '<a href="' . $this->r_encode_html($url . $slash) . '"' . $atts . $this->rel . '>' . trim($text) . '</a>' . $post; |
763 |
|
764 |
// $this->dump($out);
|
765 |
return $this->shelve($out); |
766 |
|
767 |
} |
768 |
|
769 |
// -------------------------------------------------------------
|
770 |
function getRefs($text) |
771 |
{ |
772 |
return preg_replace_callback("/(?<=^|\s)\[(.+)\]((?:http:\/\/|\/)\S+)(?=\s|$)/U", |
773 |
array(&$this, "refs"), $text); |
774 |
} |
775 |
|
776 |
// -------------------------------------------------------------
|
777 |
function refs($m) |
778 |
{ |
779 |
list(, $flag, $url) = $m; |
780 |
$this->urlrefs[$flag] = $url; |
781 |
return ''; |
782 |
} |
783 |
|
784 |
// -------------------------------------------------------------
|
785 |
function checkRefs($text) |
786 |
{ |
787 |
return (isset($this->urlrefs[$text])) ? $this->urlrefs[$text] : $text; |
788 |
} |
789 |
|
790 |
// -------------------------------------------------------------
|
791 |
function relURL($url) |
792 |
{ |
793 |
$parts = parse_url($url); |
794 |
if ((empty($parts['scheme']) or @$parts['scheme'] == 'http') and |
795 |
empty($parts['host']) and |
796 |
preg_match('/^\w/', @$parts['path'])) |
797 |
$url = $this->hu.$url; |
798 |
if ($this->restricted and !empty($parts['scheme']) and |
799 |
!in_array($parts['scheme'], $this->url_schemes)) |
800 |
return '#'; |
801 |
return $url; |
802 |
} |
803 |
|
804 |
// -------------------------------------------------------------
|
805 |
function isRelURL($url) |
806 |
{ |
807 |
$parts = parse_url($url); |
808 |
return (empty($parts['scheme']) and empty($parts['host'])); |
809 |
} |
810 |
|
811 |
// -------------------------------------------------------------
|
812 |
function image($text) |
813 |
{ |
814 |
return preg_replace_callback("/ |
815 |
(?:[[{])? # pre
|
816 |
\! # opening !
|
817 |
(\<|\=|\>)? # optional alignment atts
|
818 |
($this->c) # optional style,class atts
|
819 |
(?:\. )? # optional dot-space
|
820 |
([^\s(!]+) # presume this is the src
|
821 |
\s? # optional space
|
822 |
(?:\(([^\)]+)\))? # optional title
|
823 |
\! # closing
|
824 |
(?::(\S+))? # optional href
|
825 |
(?:[\]}]|(?=\s|$|\))) # lookahead: space or end of string
|
826 |
/x", array(&$this, "fImage"), $text); |
827 |
} |
828 |
|
829 |
// -------------------------------------------------------------
|
830 |
function fImage($m) |
831 |
{ |
832 |
list(, $algn, $atts, $url) = $m; |
833 |
$atts = $this->pba($atts); |
834 |
$atts .= ($algn != '') ? ' align="' . $this->iAlign($algn) . '"' : ''; |
835 |
$atts .= (isset($m[4])) ? ' title="' . $m[4] . '"' : ''; |
836 |
$atts .= (isset($m[4])) ? ' alt="' . $m[4] . '"' : ' alt=""'; |
837 |
$size = false; |
838 |
if ($this->isRelUrl($url)) |
839 |
$size = @getimagesize(realpath($this->doc_root.ltrim($url, $this->ds))); |
840 |
if ($size) $atts .= " $size[3]"; |
841 |
|
842 |
$href = (isset($m[5])) ? $this->checkRefs($m[5]) : ''; |
843 |
$url = $this->checkRefs($url); |
844 |
|
845 |
$url = $this->relURL($url); |
846 |
|
847 |
$out = array( |
848 |
($href) ? '<a href="' . $href . '">' : '', |
849 |
'<img src="' . $url . '"' . $atts . ' />', |
850 |
($href) ? '</a>' : '' |
851 |
); |
852 |
|
853 |
return join('',$out); |
854 |
} |
855 |
|
856 |
// -------------------------------------------------------------
|
857 |
function code($text) |
858 |
{ |
859 |
$text = $this->doSpecial($text, '<code>', '</code>', 'fCode'); |
860 |
$text = $this->doSpecial($text, '@', '@', 'fCode'); |
861 |
$text = $this->doSpecial($text, '<pre>', '</pre>', 'fPre'); |
862 |
return $text; |
863 |
} |
864 |
|
865 |
// -------------------------------------------------------------
|
866 |
function fCode($m) |
867 |
{ |
868 |
@list(, $before, $text, $after) = $m; |
869 |
return $before.$this->shelve('<code>'.$this->r_encode_html($text).'</code>').$after; |
870 |
} |
871 |
|
872 |
// -------------------------------------------------------------
|
873 |
function fPre($m) |
874 |
{ |
875 |
@list(, $before, $text, $after) = $m; |
876 |
return $before.'<pre>'.$this->shelve($this->r_encode_html($text)).'</pre>'.$after; |
877 |
} |
878 |
// -------------------------------------------------------------
|
879 |
function shelve($val) |
880 |
{ |
881 |
$i = uniqid(rand()); |
882 |
$this->shelf[$i] = $val; |
883 |
return $i; |
884 |
} |
885 |
|
886 |
// -------------------------------------------------------------
|
887 |
function retrieve($text) |
888 |
{ |
889 |
if (is_array($this->shelf)) |
890 |
do {
|
891 |
$old = $text; |
892 |
$text = strtr($text, $this->shelf); |
893 |
} while ($text != $old); |
894 |
|
895 |
return $text; |
896 |
} |
897 |
|
898 |
// -------------------------------------------------------------
|
899 |
// NOTE: deprecated
|
900 |
function incomingEntities($text) |
901 |
{ |
902 |
return preg_replace("/&(?![#a-z0-9]+;)/i", "x%x%", $text); |
903 |
} |
904 |
|
905 |
// -------------------------------------------------------------
|
906 |
// NOTE: deprecated
|
907 |
function encodeEntities($text) |
908 |
{ |
909 |
return (function_exists('mb_encode_numericentity')) |
910 |
? $this->encode_high($text) |
911 |
: htmlentities($text, ENT_NOQUOTES, "utf-8"); |
912 |
} |
913 |
|
914 |
// -------------------------------------------------------------
|
915 |
// NOTE: deprecated
|
916 |
function fixEntities($text) |
917 |
{ |
918 |
/* de-entify any remaining angle brackets or ampersands */
|
919 |
return str_replace(array(">", "<", "&"), |
920 |
array(">", "<", "&"), $text); |
921 |
} |
922 |
|
923 |
// -------------------------------------------------------------
|
924 |
function cleanWhiteSpace($text) |
925 |
{ |
926 |
$out = str_replace("\r\n", "\n", $text); # DOS line endings |
927 |
$out = preg_replace("/^ *\n/m", "\n", $out); # lines containing only spaces |
928 |
$out = preg_replace("/\n{3,}/", "\n\n", $out); # 3 or more line ends |
929 |
$out = preg_replace("/^\n*/", "", $out); # leading blank lines |
930 |
return $out; |
931 |
} |
932 |
|
933 |
// -------------------------------------------------------------
|
934 |
function doSpecial($text, $start, $end, $method='fSpecial') |
935 |
{ |
936 |
return preg_replace_callback('/(^|\s|[[({>])'.preg_quote($start, '/').'(.*?)'.preg_quote($end, '/').'(\s|$|[\])}])?/ms', |
937 |
array(&$this, $method), $text); |
938 |
} |
939 |
|
940 |
// -------------------------------------------------------------
|
941 |
function fSpecial($m) |
942 |
{ |
943 |
// A special block like notextile or code
|
944 |
@list(, $before, $text, $after) = $m; |
945 |
return $before.$this->shelve($this->encode_html($text)).$after; |
946 |
} |
947 |
|
948 |
// -------------------------------------------------------------
|
949 |
function noTextile($text) |
950 |
{ |
951 |
$text = $this->doSpecial($text, '<notextile>', '</notextile>', 'fTextile'); |
952 |
return $this->doSpecial($text, '==', '==', 'fTextile'); |
953 |
|
954 |
} |
955 |
|
956 |
// -------------------------------------------------------------
|
957 |
function fTextile($m) |
958 |
{ |
959 |
@list(, $before, $notextile, $after) = $m; |
960 |
#$notextile = str_replace(array_keys($modifiers), array_values($modifiers), $notextile);
|
961 |
return $before.$this->shelve($notextile).$after; |
962 |
} |
963 |
|
964 |
// -------------------------------------------------------------
|
965 |
function footnoteRef($text) |
966 |
{ |
967 |
return preg_replace('/\b\[([0-9]+)\](\s)?/Ue', |
968 |
'$this->footnoteID(\'\1\',\'\2\')', $text); |
969 |
} |
970 |
|
971 |
// -------------------------------------------------------------
|
972 |
function footnoteID($id, $t) |
973 |
{ |
974 |
if (empty($this->fn[$id])) |
975 |
$this->fn[$id] = uniqid(rand()); |
976 |
$fnid = $this->fn[$id]; |
977 |
return '<sup class="footnote"><a href="#fn'.$fnid.'">'.$id.'</a></sup>'.$t; |
978 |
} |
979 |
|
980 |
// -------------------------------------------------------------
|
981 |
function glyphs($text) |
982 |
{ |
983 |
|
984 |
// fix: hackish
|
985 |
$text = preg_replace('/"\z/', "\" ", $text); |
986 |
$pnc = '[[:punct:]]'; |
987 |
|
988 |
$glyph_search = array( |
989 |
'/(\w)\'(\w)/', // apostrophe's |
990 |
'/(\s)\'(\d+\w?)\b(?!\')/', // back in '88 |
991 |
'/(\S)\'(?=\s|'.$pnc.'|<|$)/', // single closing |
992 |
'/\'/', // single opening |
993 |
'/(\S)\"(?=\s|'.$pnc.'|<|$)/', // double closing |
994 |
'/"/', // double opening |
995 |
'/\b([A-Z][A-Z0-9]{2,})\b(?:[(]([^)]*)[)])/', // 3+ uppercase acronym |
996 |
'/\b([A-Z][A-Z\'\-]+[A-Z])(?=[\s.,\)>]|$)/', // 3+ uppercase |
997 |
'/\b( )?\.{3}/', // ellipsis |
998 |
'/(\s?)--(\s?)/', // em dash |
999 |
'/\s-(?:\s|$)/', // en dash |
1000 |
'/(\d+)( ?)x( ?)(?=\d+)/', // dimension sign |
1001 |
'/(\b ?|\s|^)[([]TM[])]/i', // trademark |
1002 |
'/(\b ?|\s|^)[([]R[])]/i', // registered |
1003 |
'/(\b ?|\s|^)[([]C[])]/i', // copyright |
1004 |
); |
1005 |
|
1006 |
extract($this->glyph, EXTR_PREFIX_ALL, 'txt'); |
1007 |
|
1008 |
$glyph_replace = array( |
1009 |
'$1'.$txt_apostrophe.'$2', // apostrophe's |
1010 |
'$1'.$txt_apostrophe.'$2', // back in '88 |
1011 |
'$1'.$txt_quote_single_close, // single closing |
1012 |
$txt_quote_single_open, // single opening |
1013 |
'$1'.$txt_quote_double_close, // double closing |
1014 |
$txt_quote_double_open, // double opening |
1015 |
'<acronym title="$2">$1</acronym>', // 3+ uppercase acronym |
1016 |
'<span class="caps">$1</span>', // 3+ uppercase |
1017 |
'$1'.$txt_ellipsis, // ellipsis |
1018 |
'$1'.$txt_emdash.'$2', // em dash |
1019 |
' '.$txt_endash.' ', // en dash |
1020 |
'$1$2'.$txt_dimension.'$3', // dimension sign |
1021 |
'$1'.$txt_trademark, // trademark |
1022 |
'$1'.$txt_registered, // registered |
1023 |
'$1'.$txt_copyright, // copyright |
1024 |
); |
1025 |
|
1026 |
$text = preg_split("/(<.*>)/U", $text, -1, PREG_SPLIT_DELIM_CAPTURE); |
1027 |
foreach($text as $line) { |
1028 |
if (!preg_match("/<.*>/", $line)) { |
1029 |
$line = preg_replace($glyph_search, $glyph_replace, $line); |
1030 |
} |
1031 |
$glyph_out[] = $line; |
1032 |
} |
1033 |
return join('', $glyph_out); |
1034 |
} |
1035 |
|
1036 |
// -------------------------------------------------------------
|
1037 |
function iAlign($in) |
1038 |
{ |
1039 |
$vals = array( |
1040 |
'<' => 'left', |
1041 |
'=' => 'center', |
1042 |
'>' => 'right'); |
1043 |
return (isset($vals[$in])) ? $vals[$in] : ''; |
1044 |
} |
1045 |
|
1046 |
// -------------------------------------------------------------
|
1047 |
function hAlign($in) |
1048 |
{ |
1049 |
$vals = array( |
1050 |
'<' => 'left', |
1051 |
'=' => 'center', |
1052 |
'>' => 'right', |
1053 |
'<>' => 'justify'); |
1054 |
return (isset($vals[$in])) ? $vals[$in] : ''; |
1055 |
} |
1056 |
|
1057 |
// -------------------------------------------------------------
|
1058 |
function vAlign($in) |
1059 |
{ |
1060 |
$vals = array( |
1061 |
'^' => 'top', |
1062 |
'-' => 'middle', |
1063 |
'~' => 'bottom'); |
1064 |
return (isset($vals[$in])) ? $vals[$in] : ''; |
1065 |
} |
1066 |
|
1067 |
// -------------------------------------------------------------
|
1068 |
// NOTE: deprecated
|
1069 |
function encode_high($text, $charset = "UTF-8") |
1070 |
{ |
1071 |
return mb_encode_numericentity($text, $this->cmap(), $charset); |
1072 |
} |
1073 |
|
1074 |
// -------------------------------------------------------------
|
1075 |
// NOTE: deprecated
|
1076 |
function decode_high($text, $charset = "UTF-8") |
1077 |
{ |
1078 |
return mb_decode_numericentity($text, $this->cmap(), $charset); |
1079 |
} |
1080 |
|
1081 |
// -------------------------------------------------------------
|
1082 |
// NOTE: deprecated
|
1083 |
function cmap() |
1084 |
{ |
1085 |
$f = 0xffff; |
1086 |
$cmap = array( |
1087 |
0x0080, 0xffff, 0, $f); |
1088 |
return $cmap; |
1089 |
} |
1090 |
|
1091 |
// -------------------------------------------------------------
|
1092 |
function encode_html($str, $quotes=1) |
1093 |
{ |
1094 |
$a = array( |
1095 |
'&' => '&', |
1096 |
'<' => '<', |
1097 |
'>' => '>', |
1098 |
); |
1099 |
if ($quotes) $a = $a + array( |
1100 |
"'" => ''', |
1101 |
'"' => '"', |
1102 |
); |
1103 |
|
1104 |
return strtr($str, $a); |
1105 |
} |
1106 |
|
1107 |
// -------------------------------------------------------------
|
1108 |
function r_encode_html($str, $quotes=1) |
1109 |
{ |
1110 |
// in restricted mode, input has already been escaped
|
1111 |
if ($this->restricted) |
1112 |
return $str; |
1113 |
return $this->encode_html($str, $quotes); |
1114 |
} |
1115 |
|
1116 |
// -------------------------------------------------------------
|
1117 |
function textile_popup_help($name, $helpvar, $windowW, $windowH) |
1118 |
{ |
1119 |
return ' <a target="_blank" href="http://www.textpattern.com/help/?item=' . $helpvar . '" onclick="window.open(this.href, \'popupwindow\', \'width=' . $windowW . ',height=' . $windowH . ',scrollbars,resizable\'); return false;">' . $name . '</a><br />'; |
1120 |
|
1121 |
return $out; |
1122 |
} |
1123 |
|
1124 |
// -------------------------------------------------------------
|
1125 |
// NOTE: deprecated
|
1126 |
function txtgps($thing) |
1127 |
{ |
1128 |
if (isset($_POST[$thing])) { |
1129 |
if (get_magic_quotes_gpc()) { |
1130 |
return stripslashes($_POST[$thing]); |
1131 |
} |
1132 |
else {
|
1133 |
return $_POST[$thing]; |
1134 |
} |
1135 |
} |
1136 |
else {
|
1137 |
return ''; |
1138 |
} |
1139 |
} |
1140 |
|
1141 |
// -------------------------------------------------------------
|
1142 |
// NOTE: deprecated
|
1143 |
function dump() |
1144 |
{ |
1145 |
foreach (func_get_args() as $a) |
1146 |
echo "\n<pre>",(is_array($a)) ? print_r($a) : $a, "</pre>\n"; |
1147 |
} |
1148 |
|
1149 |
// -------------------------------------------------------------
|
1150 |
|
1151 |
function blockLite($text) |
1152 |
{ |
1153 |
$this->btag = array('bq', 'p'); |
1154 |
return $this->block($text."\n\n"); |
1155 |
} |
1156 |
|
1157 |
|
1158 |
} // end class
|
1159 |
|
1160 |
?>
|