<?php
/**
* TEXT HTML's TAGS EMULATOR
* Compatibility: PHP >= 4.1
* Page Example: http://www.3site.it/varie/codeLighter/index.php
* ---------------------------------------------------------------------
* LAST FIXED: multiple URL inline, increase speed convertion, adjusted code, color and list tags, unclosed /* comment.
* Totally rewrote and fixed wrap_convert() function with url/img/mail preservation.
* LAST ADDS: [AS] tag with different highlight FlashMX like
* you can add one or more personal tags
* LAST CHANGES: IMG now use [IMG="{url}"]{comment}[/IMG] as quote and url.
* Now [PHP] & [AS] use monospace font on.
* Now are right both [URL="{URL}"] , [URL={URL}]
*
* ---------------------------------------------------------------------
* WHAT IS THIS:
* HTML 4.01 W3C Strict Standard VAlidated tags emulator with:
* personalizable style sheet
* great [tag] engine
* JavaScript crossbrowser for checks and helps
* automatic form / textarea / buttons generation
*
* ---------------------------------------------------------------------
* HOW TO USE:
* $codeLighter = new codeLighter();
* echo $codeLighter->convert($text_var);
* WARNING: the better way to use this script is give an htmlentities($text_var);
* so if you haven't converted $text_var you need to do this.
* Example:
* echo $codeLighter->convert( htmlentities($text_var) );
*
* ---------------------------------------------------------------------
* WHAT YOU CAN DO WITH THIS:
* Accepted tags: B, U, I, CODE, PHP, AS, QUOTE, LIST, MAIL, URL, IMG, FONT, SIZE, COLOR, CENTER, RIGHT
* B => [b]{TEXT}[/b]
* U => [u]{TEXT}[/u]
* I => [i]{TEXT}[/i]
* CENTER => [center]{center text}[/center]
* RIGHT => [right]{right text}[/right]
* CODE => [code]{code text}[/code]
* PHP => [php]{php text}[/php]
* ACTIONSCRIPT => [as]{action script text}[/as]
* QUOTE => [quote]{quoted text}[/quote] | [quote="posted from"]{quoted text}[/quote]
* LIST => [list][*]{TEXT}[/list] | [list=1][*]{TEXT}[/list]
* type: NULL => default, unordered list
* 1 => numeric ordered list
* [ for alphabetic list write to W3.org ... they wrote "Safe for kids" with DL sintax ... ]
*
* Example: "[list]
* [*]something
* [*]something else
* [/list]"
* Example: "[list=1]
* [*]something
* [*]something else
* [/list]"
* MAIL => {valid email addres} | [mail]{valid email addres}[/mail] | [mail={valid email addres}]{TEXT}[/mail]
* Example: "[mail]hide@address.com[/mail]"
* Example: "[mail=hide@address.com]my email[/mail]"
* URL => {valid url addres} | [url]{valid url addres}[/url] | [url="{valid url addres}"]{TEXT}[/url] | [url={valid url addres}]{TEXT}[/url]
* Example: "[url]http://www.3site.it/[/url]"
* Example: "[url="http://www.3site.it/"]hello world![/url]"
* Example: "[url=http://www.3site.it/]hello world![/url]"
* IMG => [img]{valid url addres with img}[/img] | [img="{valid url addres with img}"]{ALT/TITLE}[/img] | [img={WIDTHxHEIGHT}]{valid url addres with img}[/img]
* Example: "[img]http://www.3site.it/grafica/3site1.gif[/img]"
* Example: "[img="http://www.3site.it/grafica/3site1.gif"]this is my site's logo[/img]"
*
* Example: "[IMG=100x38]http://www.3site.it/grafica/3site1.gif[/IMG]"
* NOTE: you need to auth this last type of parsing with $codeLighter->imgSize(maxWidth, maxHeight); function.
* FONT => [font={valid font type}]{TEXT}[/font]
* Example: "[font=courier]hello[/font] [font=arial]world[/font] !"
*
* SIZE => [size={number between 1 and 9}]{TEXT}[/size]
* Example: "[size=1]hello[/size] [size=9]world[/size] !"
* COLOR => [color={valid hex value}]{TEXT}[/color] | [color=#{valid hex value}]{TEXT}[/color] | [color={valid color name}]{TEXT}[/color]
* Example: "[color=#002255]hello[/color] [color=red]world[/color] !"
*
* ---------------------------------------------------------------------
* INTERNAL VARIABLES
* $codeLighter->maxUrlLenght;
* This variable set max url length for validated link.
* DEFAULT: 100
* NOTE: you need to set this before ->convert() function.
*
* TEXTAREA SETTINGS [ optional ]
*
* $codeLighter->textareaButtons;
* This variable will return a buttons list with text's shortcuts dedicated for a textArea with id="codeLighterInternalTextarea"
* NOTE: you need to print $codeLighter->jsLighter; to enable JavaScript buttons functions
* SHORTCUTS: [B] [U] [I] [IMG] [CODE] [PHP] [URL] [MAIL]
* NOTE: You can specify different buttons with $codeLighter->area_buttons;
*
* Example:
* echo $codeLighter->jsLighter; // dedicated JavaScript functions ofr these buttons
* echo $codeLighter->textareaButtons; // buttons
*
* $codeLighter->area_buttons;
* This variable modify buttons at the top of TextArea.
* WARNING: You need to inizialize the textarea with $codeLighter->createTextareaLighter(); if you 'll not use automatic form's creator.
* DEFAULT: Array('B', 'U', 'I', 'IMG', 'CENTER', 'CODE', 'PHP', 'AS');
* MAX USAGE: Array('MAIL', 'URL', 'PHP', 'CODE', 'QUOTE', 'IMG', 'LIST', 'B', 'I', 'U', 'CENTER', 'RIGHT', 'AS');
* NOTE: LIST need [*] simbol
*
* Example:
* $codeLighter->area_buttons = Array('PHP', 'CODE', 'B', 'I', 'U'); // will create only these ordered buttons
* NOTE: You must specify this variable befor textarea print.
*
* Example with no automatic form generator:
* $codeLighter->area_buttons = Array('PHP', 'CODE', 'B', 'I', 'U'); // will create only these ordered buttons
* $codeLighter->createTextareaLighter();
* echo $codeLighter->textareaButtons;
* echo $codeLighter->textarea;
*
* $codeLighter->textarea;
* This variable will return a dedicated CSS textarea's class style with:
* class="codeLighterTextarea"
* id="codeLighterInternalTextarea"
* name="codeLighterText"
* clos="74"
* rows="10"
*
* @Author Andrea Giammarchi
* @Alias andr3a
* @Site http://www.3site.it
* @Mail hide@address.com
* @Version 0.2c
* @Begin 31/10/2003
* @lastModify 08/02/2004 18:48
* @Demo http://www.3site.it/varie/codeLighter/index.php
*/
Class codeLighter {
var $style, $output, $jsLighter, $textarea, $textareaButtons, $fake, $restriction, $newRestriction, $textarea_check, $area_buttons, $codeConverter;
var $css_code, $css_a_link, $css_a_visited, $css_a_hover, $css_quote, $css_php, $css_img, $css_button, $css_textarea, $css_textarea_span;
var $maxUrlLenght, $maxImgWidth, $maxImgHeight;
var $preg_a, $preg_b, $preg_c, $preg_d, $preg_e, $preg_f;
/**
* Public constructor.
* @Example $codeLighter = new codeLighter();
*/
function codeLighter() {
$this->newRestriction = Array();
$this->codeConverter = Array();
$this->maxImgWidth = false;
$this->maxImgHeight = false;
$this->maxUrlLenght = 100;
$this->jsAddLighter();
$this->createTextareaLighter();
$this->fake = 0;
$def_rest = Array("mail", "url", "php", "as", "code", "quote", "font", "size", "color", "img", "list", "b", "i", "u", "center", "right");
$this->restrict($def_rest);
$this->css_code = "
border: 1px solid silver;
padding: 8pt;
font-family: courier, monospace, sans-serif;
font-size: 8pt;
color: #000033;
background-color: #FAFAFA;
";
$this->css_a_link = "
text-decoration: none;
color: #000080;
font-family: Verdana, Helvetica, sans-serif;
";
$this->css_a_visited = "
text-decoration: none;
color: #002255;
font-family: Verdana, Helvetica, sans-serif;
";
$this->css_a_hover = "
text-decoration: underline;
color: #0000AA;
font-family: Verdana, Helvetica, sans-serif;
";
$this->css_quote = "
width: 100%;
height: 1%;
border: 1px solid silver;
padding: 8pt;
font-family: Verdana, Helvetica, sans-serif;
font-size: 8pt;
color: #000000;
background-color: #F1F1F1;
";
$this->css_php = "
border: 1px solid silver;
padding: 8px;
font-family: courier, monospace, sans-serif;
font-size: 8pt;
color: #000000;
background-color: #FDFDFD;
";
$this->css_img = "
border: 0px;
";
$this->css_button = "
border: 1px solid silver;
font-family: Verdena, Helvetica, sans-serif;
font-weight: bold;
color: #787878;
background-color: #EFEFEF;
font-size: 7pt;
";
$this->css_textarea = "
border: 1px solid silver;
font-family: Verdena, Helvetica, sans-serif;
font-size: 9pt;
";
$this->css_textarea_span = "
font-family: Verdana, Helvetica, sans-serif;
font-size: 7pt;
font-weight: normal;
";
$this->setCSS("code", $this->css_code);
$this->setCSS("a:link", $this->css_a_link);
$this->setCSS("a:visited", $this->css_a_visited);
$this->setCSS("a:hover", $this->css_a_hover);
$this->setCSS("php", $this->css_php);
$this->setCSS("img", $this->css_img);
$this->setCSS("button", $this->css_button);
$this->setCSS("textarea", $this->css_textarea);
$this->setCSS("textarea_check", $this->css_textarea_span);
$this->textarea_check = "Opened Tags";
$this->area_buttons = Array('B', 'U', 'I', 'IMG', 'CENTER', 'CODE', 'PHP', 'AS');
$this->preg_a = "/(?i)(^|\ |\n|\r|\t)(http|https|ftp|irc|ed2k|gopher|telnet|gopher|telnet)(\:\/\/)([^\[\<\>[:space:]]+)($|\ |\n|\r|\t)/";
$this->preg_b = "/(?i)(^|\ |\n|\r|\t)(w){3}(.)([^\[\<\>[:space:]]+)($|\ |\n|\r|\t)/";
$this->preg_c = "/(?i)\[url\=(\"|\")(http|https|ftp|irc|ed2k|gopher|telnet|gopher|telnet)(\:\/\/)([^\<\>[:space:]]+?)(\"|\")\]([^\<\>]+?)(\[\/url\])/i";
$this->preg_d = "/(?i)(\[url\=)(w){3}(\.)([^\[\<\>[:space:]]+?)(\])([^\"\<\>]+?)(\[\/url\])/i";
$this->preg_e = "/(?i)(\[url\])(http|https|ftp|irc|ed2k|gopher|telnet)(\:\/\/)([^\<\>[:space:]]+?)(\[\/url\])/i";
$this->preg_f = "/(?i)\[url\]www.([^\<\>[:space:]]+?)\[\/url\]/i";
$this->preg_g = "/(?i)\[url\=(http|https|ftp|irc|ed2k|gopher|telnet|gopher|telnet)(\:\/\/)([^\<\>[:space:]]+?)\]([^\<\>]+?)(\[\/url\])/i";
$this->createTextareaLighter();
}
/**
* Public, use to change defaults CSS.
*
* $codeLighter->setCSS($type, $value);
* With this function you can modify CSS Style
* Print in your output (in <head> </head> tags to respect W3C HTML 4.01 standard)
* the variable $codeLighter->style;
* Example:
* echo $codeLighter->style;
*
* $type => code - a:link - a:visited - a:hover - quote - php - img - button - textarea - textarea_check
* NOTE: these styles have the same CSS information for:
* code => table
* quote => table
* php => table
* img => img
* textarea => textarea
* textarea_check => span
* button => input
* a:link => a:link
* a:visited => a:visited
* a:hover => a:hover
*
* $value => valid CSS information
*
* Example:
* $CSS_code = "
* width: 100%;
* height: 1%;
* border: 1px solid silver;
* padding: 8pt;
* font-family: Verdana, Helvetica, sans-serif;
* font-size: 8pt;
* color: #000033;
* background-color: #FAFAFA;
* ";
* $codeLighter->setCSS("code", $CSS_code);
* NOTE: if you want change default CSS class values you must use setCSS , then print $codeLighter->style;
*
* @Param String what type of CSS you want change ( code, a:link, a:visited, a:hover, quote, php, as, img, button, textarea, textarea_check )
* @Param String valid CSS information.
*/
function setCSS($type, $def) {
if( strtolower($type) == "code" ) {
$this->css_code = $def;
}
elseif( strtolower($type) == "a:link" ) {
$this->css_a_link = $def;
}
elseif( strtolower($type) == "a:visited" ) {
$this->css_a_visited = $def;
}
elseif( strtolower($type) == "a:hover" ) {
$this->css_a_hover = $def;
}
elseif( strtolower($type) == "quote" ) {
$this->css_quote = $def;
}
elseif( strtolower($type) == "php" || strtolower($type) == "as" ) {
$this->css_php = $def;
}
elseif( strtolower($type) == "img" ) {
$this->css_img = $def;
}
elseif( strtolower($type) == "button" ) {
$this->css_button = $def;
}
elseif( strtolower($type) == "textarea" ) {
$this->css_textarea = $def;
}
elseif( strtolower($type) == "textarea_check" ) {
$this->css_textarea_span = $def;
}
else {
die("<br /><b>WARNING:</b> \$type given ( <b>{$type}</b> ) doesn't exist.<br />Accepted types: code, a:link, a:visited, a:hover, quote, php, img, button, textarea .<br />");
}
$this->style = "
<style type=\"text/css\">
pre.codeLighterCode {".$this->css_code."}
table.codeLighterQuote {".$this->css_quote."}
pre.codeLighterPHP {".$this->css_php."}
img.codeLighterImg {".$this->css_img."}
a.codeLighterLink:link {".$this->css_a_link."}
a.codeLighterLink:visited {".$this->css_a_visited."}
a.codeLighterLink:hover {".$this->css_a_hover."}
textarea.codeLighterTextarea {".$this->css_textarea."}
input.codeLighterButton {".$this->css_button."}
span.codeLighterSpan {".$this->css_textarea_span."}
</style>
";
return true;
}
/**
* Public, use to add one or more tags to converter.
* 2 ways to add new tags
* $codeLighter->addTag( "myTag", Array("#notes", "#variables", "#strings", "#generic") );
* $codeLighter->addTag( "myTag", "font-style: myStyle; border: myBorder;" );
* If you need another language to highlight use first method.
* If you need a table with a style ( not indented, not highlighted ) use second method BEFORE echo your
* $codeLighter->style;
* @Param String internal tag name. Example "python" ( to convert [python]{code}[/python] )
* @Param Array/String Array with 4 colors ( "#notes", "#variables", "#strings", "#generic" ) for code
* highlighted, String with regular CSS style for generic persola table
*/
function addTag( $tagName, $tagStyle ) {
$tagName = strtolower( $tagName );
$this->newRestriction[] = Array( $tagName , $tagStyle );
if( !is_Array( $tagStyle ) ) {
$newStyle = explode( "</style>", $this->style );
$newStyle = $newStyle[0];
$newset = "table.codeLighter{$tagName} { {$tagStyle} }";
$this->style = $newStyle.$newset."
</style>
";
}
}
/**
* Public, use to allow [IMG=width_X_height]{IMAGE URL}[/IMG] tag
*
* $codeLighter->imgSize($maxWidth, $maxHeight);
* This function allow parser to manipolate size of imgages.
* Converter will accept a tag like this:
* [IMG=100x38]http://www.3site.it/grafica/3site1.gif[/IMG]
* $maxWidth -> integer that will be max apceptable width value for an img
* $maxHeigh -> integer that will be max apceptable height value for an img
* NOTE: if parameters are above these value, the image will be converted with these for width or height or width & height.
* @Param int Max width
* @Param int Max height
*/
function imgSize($w, $h) {
$this->maxImgWidth = $w;
$this->maxImgHeight = $h;
$this->restriction[] = "PrivateCheckImgSize";
}
function globalRegCheck( $t ) {
$preg_modeMail = "(([a-z0-9]+[\._\-]?){1,3}([a-z0-9])*\@([a-z0-9]+[\._\-]?){1,3}([a-z0-9])*\.[a-z]{2,6})";
$preg_mail1 = "/(?i)(\[mail\])?{$preg_modeMail}(\[\/mail\])?/";
$preg_mail2 = "/(?i)\[mail\={$preg_modeMail}\]/";
$preg_imgModel = "(http|https|ftp)(\:\/\/)([^\<\>[:space:]]+?)";
$preg_img1 = "/(?i)\[img\]{$preg_imgModel}\[\/img\]/i";
$preg_img2 = "/(?i)\[img\=(\"|\"){$preg_imgModel}(\"|\")\]/i";
$preg_img3 = "/(?i)\[img\=([0-9]{1,}x[0-9]{1,})\]{$preg_imgModel}\[\/img\]/i";
$preg_urlModel = "(http|https|ftp|irc|ed2k|gopher|telnet)(\:\/\/)([^\[\<\>[:space:]]+?)";
$preg_url1 = "/(?i)^{$preg_urlModel}/i";
$preg_url2 = "/(?i)^((w){3}(.)([^\[\<\>[:space:]]+))/i";
$preg_url3 = "/(?i)(\[url\=)(w){3}(\.)([^\[\<\>[:space:]]+?)(\])/i";
$preg_url4 = "/(?i)\[url\=(\"|\")?{$preg_urlModel}(\"|\")?\]/i";
$preg_url5 = "/(?i)(\[url\]){$preg_urlModel}(\[\/url\])/i";
$preg_url6 = "/(?i)\[url\]www.([^\<\>[:space:]]+?)\[\/url\]/i";
if( preg_match($preg_url6, $t) || preg_match($preg_url5, $t) || preg_match($preg_url4, $t) || preg_match($preg_url3, $t) || preg_match($preg_url2, $t) || preg_match($preg_url1, $t) || preg_match($preg_modeMail, $t) || preg_match($preg_mail1, $t) || preg_match($preg_mail2, $t) || preg_match($preg_img1, $t) || preg_match($preg_img2, $t) || preg_match($preg_img3, $t) ) {
return true;
}
else {
return false;
}
}
function wrapConvert( $text, $size, $force = true, $tag = " " ) {
$withN = explode("\n\r", trim($text));
$globalWrap = "";
for( $a=0; $za=count($withN), $a < $za; $a++ ) {
$ex = explode(" ", trim($withN[$a]));
for( $b=0; $zb = count($ex), $b < $zb; $b++ ) {
if( $this->globalRegCheck($ex[$b]) ) {
$globalWrap .= $ex[$b];
}
else {
$provvisory = "";
$where = 0;
$ex[$b] = $this->unhtmlentities( $ex[$b] );
if($force == false) {
if( strlen($ex[$b]) > $size && !is_numeric($ex[$b]) ) {
for($c=0; $zc = (ceil(strlen($ex[$b])/$size)), $c < $zc; $c++) {
$provvisory .= substr($ex[$b],$where,$size).$tag;
$where += $size;
}
}
else {
$provvisory = $ex[$b];
}
}
else {
if( strlen($ex[$b])>$size ) {
for($c=0; $zd = (ceil(strlen($ex[$b])/$size)), $c < $zd; $c++) {
$provvisory .= substr($ex[$b],$where,$size).$tag;
$where += $size;
}
}
else {
$provvisory = $ex[$b];
}
}
$globalWrap .= htmlentities( $provvisory );
}
$globalWrap .= " ";
}
$globalWrap .= "\n\r";
}
return $globalWrap;
}
/**
* Public, use to modify text without delete valid urls , img or emails tags
*
* $codeLighter->wrap_convert($text_var, $max_length [, $convert_numerics [, $separator]]);
* This function will parse the text as ->convert(); but you can specify max words lenght.
* Such PHP's wordwrap function, this method allow you to chose max lenght of a word and separator type.
*
* $text_var -> text with htmlentities(); // as needed to ->convert();
* $max_length -> max words length // will truncate with chosed separator
* $convert_numerics -> DEFAULT: true // will truncate numbers too
* with false value will not truncate numbers
* $separator -> DEFAULT: " " // only trybcated words will have this kind of separator [ not as wordwrap, separate everything ... ]
* NOTE: this kind of converter doesn't truncate links/emails, use ->maxUrlLenght to manage links length
* @Param String your not yet converted string
* @Param int max word length
* @Param boolean force numeric convertion ( default: true )
* @Param String separator tag ( default: " " )
*/
function wrap_convert( $text, $size, $force = true, $tag = " " ) {
return $this->convert( $this->wrapConvert($text, $size, $force, $tag) );
}
function ereg_engine($st, $a_name, $pre, $suf) {
while( preg_match( "/(?i)\[{$a_name}\]([^\a]+?)\[\/{$a_name}\]/i", $st ) ) {
$st = preg_replace("/(?i)\[{$a_name}\]([^\a]+?)\[\/{$a_name}\]/i", $pre."\\1".$suf, $st);
}
return $st;
}
function case_insensitive_check($st, $tag) {
$st = preg_replace( "/(?i)\[{$tag}\]([^\a]+?)\[\/{$tag}\]/i", "[{$tag}]\\1[/{$tag}]", $st );
return $st;
}
function unhtmlentities($mystring) {
$phpv = explode(".", phpversion());
if($phpv[0]==4 && $phpv[1]<3) {
// FROM: www.php.net
$trans_tbl = get_html_translation_table(HTML_ENTITIES);
$trans_tbl = array_flip ($trans_tbl);
return strtr($mystring, $trans_tbl);
}
else {
return html_entity_decode($mystring);
}
}
function codeModifier( $mod, &$st, &$pre_table_desc, $c1="#FF8000", $c2="#0000BB", $c3="#DD0000", $c4="#007700", $btw = false ) {
if( in_Array( $mod, $this->restriction ) || $btw != false ) {
preg_match_all("/(?i)\[{$mod}\]([^\a]+?)\[\/{$mod}\]/i", $st, $php);
$countPhp = count( $php[1] );
for( $a = 0; $a < $countPhp; $a++ ) {
$elaborate = trim($php[1][$a]);
$check_add_pre = false;
$check_add_suf = false;
if((strpos($elaborate, "<?php") === false) && (strpos($elaborate, "<?PHP") === false) && (strpos($elaborate,"<?") === false)) {
$elaborate = "<?php\n".trim($elaborate);
$check_add_pre = true;
}
if((strpos($elaborate, "?>") === false)) {
$elaborate = $elaborate."?>";
$check_add_suf = true;
}
$preserve = md5(" \n\r");
$elaborate = preg_replace("/( )([\\n\\r]+){1}( )/", $preserve, $elaborate);
$elaborate = preg_replace("/( )([\\n\\r^ ]+){1}/", $preserve, $elaborate);
$elaborate .= "*/";
$elaborate = highlight_string( $this->unhtmlentities( $elaborate ), true );
if( $check_add_pre == true ) {
$elaborate = str_replace("<font color=\"#0000BB\"><?php<br /></font>", "", $elaborate);
$elaborate = str_replace("<?php<br />", "", $elaborate);
}
if( $check_add_suf == true ) {
$elaborate = str_replace("<font color=\"#0000BB\">?></font>", "", $elaborate);
$elaborate = str_replace("?>", "", $elaborate);
}
$elaborate = preg_replace("/(\\n|\\r)/", "", $elaborate );
$elaborate = str_replace($preserve, "\r", $elaborate );
$elaborate = str_replace("<font color=\"", "<span style=\"color: ", $elaborate);
$elaborate = str_replace("#FF8000", $c1, $elaborate);
$elaborate = str_replace("#0000BB", $c2, $elaborate);
$elaborate = str_replace("#DD0000", $c3, $elaborate);
$elaborate = str_replace("#007700", $c4, $elaborate);
$elaborate = str_replace("</font>", "</span>", $elaborate);
$elaborate = str_replace("<code>", "", $elaborate);
$elaborate = str_replace("</code>", "", $elaborate);
if( substr($elaborate, ( strlen($elaborate) - 9 ), 9) == "*/</span>" ) {
$elaborate = substr($elaborate, 0, ( strlen($elaborate) - 9 ) );
}
$st = $this->case_insensitive_check($st, "php");
$pre = "{$pre_table_desc}".strtoupper($mod)."</span><pre class=\"codeLighterPHP\">";
$toChange = md5("[{$mod}]{$php[1][$a]}[/{$mod}]");
$this->codeConverter[] = Array( $toChange, $pre.$elaborate."</pre>" );
$st = str_replace( "[{$mod}]{$php[1][$a]}[/{$mod}]", $toChange, $st);
}
}
}
/**
* Global function.
* Converter engine.
*
* @Params no-params don't need params.
*/
function convert($st) {
if(get_magic_quotes_gpc()) {
$st = stripslashes($st);
}
$pre_table_desc = "<span style=\"font-family: Verdana, Helvetica, sans-serif; font-size: 7pt; font-style: normal; text-decoration: none; font-weight: bold;\">";
$this->codeModifier( "php", $st, $pre_table_desc );
$this->codeModifier( "as", $st, $pre_table_desc, "#898989", "#000080", "#0000EE", "#000000" );
if(in_Array("url", $this->restriction)) {
$preg_searc = Array(
"/(?i)(^|\ |\n|\r|\t)(ed2k\:\/\/\|file\|)([^\|\<\>[:space:]]+)(\|[^\[\<\>[:space:]]+)($|\ |\n|\r|\t)/",
$this->preg_b,
$this->preg_d,
$this->preg_a,
$this->preg_e,
$this->preg_f
);
$preg_replace = Array(
"\\1<a class=\"codeLighterLink\" href=\"\\2\\3\\4\" onClick=\"window.open(this.href, '_blank'); return false;\">\\3</a>\\5",
"\\1<a class=\"codeLighterLink\" href=\"http://www\\3\\4\" onClick=\"window.open(this.href, '_blank'); return false;\">www\\3\\4</a>\\5",
"<a class=\"codeLighterLink\" href=\"http://www\\3\\4\" onClick=\"window.open(this.href, '_blank'); return false;\">\\6</a>",
"\\1[url]\\2\\3\\4[/url]\\5",
"<a class=\"codeLighterLink\" href=\"\\2\\3\\4\" onClick=\"window.open(this.href, '_blank'); return false;\">\\2\\3\\4</a>",
"<a class=\"codeLighterLink\" href=\"http://www.\\1\" onClick=\"window.open(this.href, '_blank'); return false;\">www.\\1</a>"
);
$st = preg_replace($preg_searc, $preg_replace, $st);
}
$array_lighter = Array(
Array(
"name" => "i",
"pre" => "<i>",
"suf" => "</i>",
),
Array(
"name" => "u",
"pre" => "<span style=\"text-decoration: underline;\">",
"suf" => "</span>",
),
Array(
"name" => "b",
"pre" => "<b>",
"suf" => "</b>",
),
Array(
"name" => "code",
"pre" => "{$pre_table_desc}code</span><pre class=\"codeLighterCode\">",
"suf" => "</pre>",
),
Array(
"name" => "quote",
"pre" => "{$pre_table_desc}quote</span><table class=\"codeLighterQuote\"><tr valign=\"top\"><td align=\"left\">",
"suf" => "</td></tr></table>",
)
);
for($a=0; $a<count($array_lighter); $a++) {
$a_name = $array_lighter[$a]["name"];
if( in_Array($a_name, $this->restriction) ) {
$st = $this->ereg_engine($st, $a_name, $array_lighter[$a]["pre"], $array_lighter[$a]["suf"]);
}
}
$r = "([a-z0-9]+[\._\-]?){1,3}([a-z0-9])*";
$reg_mail2 = "({$r}\@{$r}\.[a-z]{2,6})";
$reg_mail = "(^|\ |\n|\r|\t){$reg_mail2}(\ |\n|\r|\t|$)";
if(in_Array("mail", $this->restriction)) {
$st = preg_replace("/(?i)".$reg_mail."/", "\\1[mail]\\2[/mail]\\7", $st);
}
$elements = Array(
Array("url", $this->preg_c, "<a class=\"codeLighterLink\" href=\"\\2\\3\\4\" onClick=\"window.open(this.href, '_blank'); return false;\">\\6</a>"),
Array("url", $this->preg_g, "<a class=\"codeLighterLink\" href=\"\\1\\2\\3\" onClick=\"window.open(this.href, '_blank'); return false;\">\\4</a>"),
Array("mail", "/(?i)\[mail\={$reg_mail2}\](.+?)\[\/mail\]/i", "<a class=\"codeLighterLink\" href=\"mailto:\\1\">\\6</a>"),
Array("mail", "/(?i)\[mail\]{$reg_mail2}\[\/mail\]/i", "<a class=\"codeLighterLink\" href=\"mailto:\\1\">\\1</a>"),
Array("center", "/(?i)\[center\]([^\a]+?)\[\/center\]/i", "<div style=\"text-align: center;\">\\1</div>"),
Array("quote", "/(?i)\[quote\=("|\")([^\n\r\t\<\>]+?)("|\")\]([^\a]+?)\[\/quote\]/i", "{$pre_table_desc}quote</span><br /> <table class=\"codeLighterQuote\"><tr valign=\"top\"><td align=\"left\"><b>\\2</b><br />\\4</td></tr></table>"),
Array("right", "/(?i)\[right\]([^\a]+?)\[\/right\]/i", "<div style=\"text-align: right;\">\\1</div>"),
Array("size", "/(?i)\[size\=([1-9])\]([^\a]+?)\[\/size\]/i", "<span style=\"font-size: \\1pt;\">\\2</span>"),
Array("color", "/(?i)\[color\=([\#]?[0-9a-f]{3}|[\#]?[0-9a-f]{6}|[a-z]{3,})\]([^\a]+?)\[\/color\]/i", "<span style=\"color: \\1;\">\\2</span>"),
Array("font", "/(?i)\[font\=([a-z]+)\]([^\a]+?)\[\/font\]/i", "<span style=\"font-family: \\1, Helvetica, sans-serif;\">\\2</span>"),
Array("img", "/(?i)\[img\=(\"|\")(http|https|ftp|irc|ed2k|gopher|telnet)?(\:\/\/)?([^\<\>[:space:]]+)(\"|\")\](.+?)\[\/img\]/i", "<img class=\"codeLighterImg\" src=\"\\2\\3\\4\" alt=\"\\6\" title=\"\\6\" />")
);
for( $elm = 0; $elm < count( $elements ); $elm++ ) {
$element = $elements[$elm][0];
if( in_Array($element, $this->restriction ) ) {
while( preg_match($elements[$elm][1], $st ) ) {
$st = preg_replace( $elements[$elm][1], $elements[$elm][2], $st );
}
if( $element == "size" ) {
$codeLighter_private_replace_callback = create_function(
'$replacement',
'return $replacement[2] == 1 ? $replacement[1]."7".$replacement[3] : $replacement[1].( 7 + ceil($replacement[2]/2) + $replacement[2] ).$replacement[3];'
);
$st = preg_replace_callback("/(\<span style\=\"font-size: )([1-9])(pt;\"\>)/", "$codeLighter_private_replace_callback", $st);
}
}
}
if( in_Array("code", $this->restriction) ) {
$st = preg_replace( "/(\<pre class\=\"codeLighterCode\"\>)([[:space:]]*)([^\a]+?)([[:space:]]*)(\<\/pre\>)/i", "\\1\\3\\5", $st );
}
if( in_Array("img", $this->restriction) ) {
$st = preg_replace("/(?i)\[img\](http|https|ftp)(\:\/\/)([^\<\>[:space:]]+?)\[\/img\]/i", "<img class=\"codeLighterImg\" src=\"\\1\\2\\3\" alt=\"\" title=\"\" />", $st);
}
if( in_Array("PrivateCheckImgSize", $this->restriction) ) {
$codeLighter_private_replace_callback = create_function(
'$replacement',
'$sizes = str_replace("X", "x", $replacement[1]);
$sizes = explode("x", $sizes);
if($sizes[0]>0 && $sizes[0]<='.$this->maxImgWidth.' && $sizes[1]>0 && $sizes[1]<='.$this->maxImgHeight.') {
return "<img class=\"codeLighterImg\" src=\"".$replacement[2].$replacement[3].$replacement[4]."\" alt=\"\" title=\"\" style=\"width: ".$sizes[0]."px; height: ".$sizes[1]."px;\" />";
}
elseif($sizes[0]>'.$this->maxImgWidth.' && $sizes[1]<='.$this->maxImgHeight.') {
return "<img class=\"codeLighterImg\" src=\"".$replacement[2].$replacement[3].$replacement[4]."\" alt=\"\" title=\"\" style=\"width: '.$this->maxImgWidth.'px; height: ".$sizes[1]."px;\" />";
}
elseif($sizes[0]<='.$this->maxImgWidth.' && $sizes[1]>'.$this->maxImgHeight.') {
return "<img class=\"codeLighterImg\" src=\"".$replacement[2].$replacement[3].$replacement[4]."\" alt=\"\" title=\"\" style=\"width: ".$sizes[0]."px; height: '.$this->maxImgHeight.'px;\" />";
}
else {
return "[img=".$sizes[0]."x".$sizes[1]."]".$replacement[2].$replacement[3].$replacement[4]."[/img]";
}');
$st = preg_replace_callback("/(?i)\[img\=([0-9]{1,}x[0-9]{1,})\](http|https|ftp)(\:\/\/)([^\<\>[:space:]]+?)\[\/img\]/i", "$codeLighter_private_replace_callback", $st);
}
if( in_Array("list", $this->restriction) ) {
$codeLighter_private_replace_callback = create_function(
'$replacement',
'return "<ol>".str_replace("[*]", "<li>", $replacement[2])."</ol>";'
);
$st = preg_replace_callback("/(?i)(\[list\=1\])([^\a]+?)(\[\/list\])/i", "$codeLighter_private_replace_callback", $st);
$codeLighter_private_replace_callback = create_function(
'$replacement',
'return "<ul>".str_replace("[*]", "<li>", $replacement[2])."</ul>";'
);
$st = preg_replace_callback("/(?i)(\[list\])([^\a]+?)(\[\/list\])/i", "$codeLighter_private_replace_callback", $st);
}
if(in_Array("mail", $this->restriction)) {
$preg_searc = "/(\<a class\=\"codeLighterLink\" href\=\"mailto\:)([^\a]+?)(\"\>)([^\a]+?)(\<\/a\>)/i";
$st = $this->replaceCallbackMailUrl( $preg_searc, $st );
}
if(in_Array("url", $this->restriction)) {
$preg_searc = "/(\<a class\=\"codeLighterLink\" href\=\")([^\a]+?)(\" onClick\=\"window.open\(this.href, '_blank'\); return false;\"\>)([^\a]+?)(\<\/a\>)/i";
$st = $this->replaceCallbackMailUrl( $preg_searc, $st );
}
$a = count( $this->newRestriction );
if( $a > 0 ) {
$pre_table_desc = "<span style=\"font-family: Verdana, Helvetica, sans-serif; font-size: 7pt; font-style: normal; text-decoration: none; font-weight: bold;\">";
for( $b = 0; $b < $a; $b++ ) {
if( is_Array( $this->newRestriction[$b][1] ) ) {
$col1 = $this->newRestriction[$b][1][0];
$col2 = $this->newRestriction[$b][1][1];
$col3 = $this->newRestriction[$b][1][2];
$col4 = $this->newRestriction[$b][1][3];
$this->codeModifier( $this->newRestriction[$b][0], $st, $pre_table_desc , $col1, $col2, $col3, $col4, true );
}
else {
$pre = "{$pre_table_desc}{$this->newRestriction[$b][0]}</span><table class=\"codeLighter{$this->newRestriction[$b][0]}\"><tr valign=\"top\"><td align=\"left\">";
$st = $this->ereg_engine($st, $this->newRestriction[$b][0], $pre, "</td></tr></table>");
}
}
}
for( $a=0; $a<count($this->codeConverter); $a++ ) {
$st = str_replace( $this->codeConverter[$a][0], $this->codeConverter[$a][1], $st );
}
$this->output = preg_replace( "/(\<br\ \/\>\<br\ \/\>|\<br\ \/\>\\n|\<br\ \/\>\\n\\r)/", " <br /> <br />", str_replace("<ul><br />", "<ul>", nl2br($st) ) );
unset($st);
return($this->output);
}
function replaceCallbackMailUrl( $preg_searc, $st ) {
$codeLighter_private_replace_callback = create_function(
'$replacement',
'if( $replacement[2] == $replacement[4] && strlen($replacement[4]) > '.$this->maxUrlLenght.' ) {
$modded = strlen($replacement[2]) > '.$this->maxUrlLenght.' ? substr($replacement[2], 0, 20)."...".substr($replacement[2], strlen($replacement[2])-20, 20) : $replacement[2];
return $replacement[1].$replacement[2].$replacement[3].$modded.$replacement[5];
}
else {
return $replacement[1].$replacement[2].$replacement[3].$replacement[4].$replacement[5];
}'
);
return preg_replace_callback($preg_searc, "$codeLighter_private_replace_callback", $st);
}
function jsAddLighter() {
$this->jsLighter = "
<script type=\"text/javascript\">
var codeLighter = function() {
// andr3a [ www.3site.it ] [ hide@address.com ]
var used = Array();
function codeLighter_add(str) {
var codeLighterTextarea_add = '';
var to_span = 'novalue';
if(!document.getElementById('codeLighterInternalTextarea')) {
alert('You need a TEXTAREA with id=\"codeLighterInternalTextarea\" to use these buttons!');
}
if(document.getElementById('codeLighterTextareaSpanChecker')!=null) {
to_span = document.getElementById('codeLighterTextareaSpanChecker').innerHTML;
to_span = parseInt(to_span);
}
if(document.getElementById('codeLighter' + str).value == '['+str+']') {
codeLighterTextarea_add = '['+str+']';
document.getElementById('codeLighter' + str).value = '[/'+str+']';
this.total.push('[/'+str+']');
if(to_span!='novalue') {
document.getElementById('codeLighterTextareaSpanChecker').innerHTML = (to_span+1);
}
}
else {
for(var a=(this.total.length-1); a>=0; a--) {
codeLighterTextarea_add += this.total[a];
var my_str = this.total[a].substr(2, (this.total[a].length-3));
document.getElementById('codeLighter' + my_str).value = '['+my_str+']';
if(to_span!='novalue') {
to_span--;
}
if(my_str==str) {
break;
}
}
if(this.total.length==0) {
codeLighterTextarea_add += '[/'+str+']';
document.getElementById('codeLighter' + str).value = '['+str+']';
if(to_span!='novalue') {
to_span--;
}
}
this.total = Array();
if(to_span!='novalue') {
document.getElementById('codeLighterTextareaSpanChecker').innerHTML = to_span;
}
}
document.getElementById('codeLighterInternalTextarea').value += codeLighterTextarea_add;
document.getElementById('codeLighterInternalTextarea').focus();
return true;
}
function codeLighter_closeTags(ar) {
var to_span = 'novalue';
for(var a=(ar.length-1); a>=0; a--) {
document.getElementById('codeLighterInternalTextarea').value += ar[a];
var my_str = ar[a].substr(2, (ar[a].length-3));
document.getElementById('codeLighter' + my_str).value = '['+my_str+']';
}
this.total = Array();
if(document.getElementById('codeLighterTextareaSpanChecker')!=null) {
to_span = document.getElementById('codeLighterTextareaSpanChecker').innerHTML;
to_span = parseInt(to_span);
}
if(to_span!='novalue') {
document.getElementById('codeLighterTextareaSpanChecker').innerHTML = '0';
}
document.getElementById('codeLighterInternalTextarea').focus();
}
function codeLighter_maxChars() {
if(this.counter!=false) {
var check_len = document.getElementById('codeLighterInternalTextarea').value.length;
var rest_len = 0;
if ( check_len >= this.counter ) {
document.getElementById('codeLighterInternalTextarea').value = document.getElementById('codeLighterInternalTextarea').value.substring(0, this.counter);
}
else {
rest_len = this.counter - check_len;
}
document.getElementById('codeLighterTextareaSpanCounter').innerHTML = rest_len;
}
else {
document.getElementById('codeLighterTextareaSpanCounter').innerHTML = document.getElementById('codeLighterInternalTextarea').value.length;
}
}
this.total = used;
this.add = codeLighter_add;
this.close = codeLighter_closeTags;
this.maxChars = codeLighter_maxChars;
this.counter = false;
}
var codeLighter = new codeLighter();
</script>
";
return true;
}
/**
* Public, textarea javascript check for text's max length
* $codeLighter->setCounter($maxChars);
* This setting allow textarea counter for text used on textarea.
* If this isn't setted / printed , the counter will check only total chars used on TextArea.
* NOTE: it works only with this class JavaScript and this class' textarea with this class' JavaScript.
* WARNING: it works only after printed JavaScript with codeLighter object, so you can print this value only after the textarea creation.
* @Param int Max chars in textarea
*/
function setCounter($max) {
return ("
<script type=\"text/javascript\">
codeLighter.counter = {$max};
</script>
");
}
/**
* Public, to modify default textarea.
* $codeLighter->createTextareaLighter($to_area, $mouse_overBG, $mouse_outBG, $mouse_overCL, $mouse_outCL);
* This function allow you to modify textarea value [ only $codeLighter->textarea ] and buttons output [ only $codeLighter->textareaButtons ]
* $to_area => DEFAULT: ""; // text into textarea
* $mouse_overBG => DEFAULT: "#FAFAFA"; // button MouseOVER background color
* $mouse_outBG => DEFAULT: "#EFEFEF"; // button MouseOUT background color
* $mouse_overCL => DEFAULT: "#565656"; // button MouseOVER text color
* $mouse_outCL => DEFAULT: "#787878"; // button MouseOUT text color
* Example:
* $codeLighter->createTextareaLighter( htmlentities( $_POST["codeLighterText"] ) );
* echo $codeLighter->textarea;
* NOTE: If you want use this not "full optional" textArea but you want use the JavaScript
* tag checker with number of opened tags, you can create by yourself
* a span tag with this id name: "codeLighterTextareaSpanChecker"
* This element will be numeric with total tags opened and not closed on textarea.
* NOTE: you need to print $codeLighter->jsLighter; to use checker function
* WARNING: this is the class's inizilizator, you must youse to apply changes on buttons or dedicated CSS
* @Param String Text to show inside textarea ( default: "" )
* @Param String Valid HEX info for button's mouse over ( background HTML color ) ( default: #FAFAFA )
* @Param String Valid HEX info for button's mouse out ( background HTML color ) ( default: #EFEFEF )
* @Param String Valid HEX info for button's mouse over ( text HTML color ) ( default: #565656 )
* @Param String Valid HEX info for button's mouse out ( text HTML color ) ( default: #787878 )
*/
function createTextareaLighter( $to_area = "", $mouse_overBG = "#FAFAFA", $mouse_outBG = "#EFEFEF", $mouse_overCL = "#565656", $mouse_outCL = "#787878", $cols = "74", $rows = "10" ) {
if( preg_match( "/^[0-9]{1,3}$/", $mouse_overBG) ) {
$cols = $mouse_overBG;
$mouse_overBG = "#FAFAFA";
}
if( preg_match( "/^[0-9]{1,3}$/", $mouse_outBG) ) {
$rows = $mouse_outBG;
$mouse_outBG = "#EFEFEF";
}
$this->textareaButtons = "";
for($a=0; $a<count($this->area_buttons); $a++) {
$this->textareaButtons .= "<input id=\"codeLighter".$this->area_buttons[$a]."\" class=\"codeLighterButton\" type=\"button\" value=\"[".$this->area_buttons[$a]."]\" onClick=\"codeLighter.add('".$this->area_buttons[$a]."');\" onMouseOver=\"this.style.background='{$mouse_overBG}'; this.style.color='{$mouse_overCL}';\" onMouseOut=\"this.style.background='{$mouse_outBG}'; this.style.color='{$mouse_outCL}';\" />
";
}
$this->textareaButtons .= "<input class=\"codeLighterButton\" type=\"button\" value=\"[ * ]\" onClick=\"codeLighter.close(codeLighter.total);\" onMouseOver=\"this.style.background='{$mouse_overBG}'; this.style.color='{$mouse_overCL}';\" onMouseOut=\"this.style.background='{$mouse_outBG}'; this.style.color='{$mouse_outCL}';\" />
";
if(get_magic_quotes_gpc()) {
$to_area = stripslashes($to_area);
}
$this->textarea = "
<br /><textarea class=\"codeLighterTextarea\" id=\"codeLighterInternalTextarea\" name=\"codeLighterText\" onKeyUp=\"codeLighter.maxChars();\" cols=\"{$cols}\" rows=\"{$rows}\">".$to_area."</textarea>";
return true;
}
/**
* Public, to modify default form.
* $codeLighter->form($action, $value, $method);
* This function return entire FORM with textarea and JavaScript functions.
* $action => DEFAULT: $_SERVER["PHP_SELF"]; // form action
* $value => DEFAULT: "SEND"; // submit button value
* $method => DEFAULT: "POST"; // form method
* NOTE: if you need to modify form style, use this class name for your CSS styleSheet: codeLighterAutoForm
* NOTE: with this function you have $codeLighter->textarea_check; variable to set tags checker text value [ DEFAULT: "OPENED TAGS" ]
*
* Example:
* $codeLighter->textarea_check = "For this post you've opened these tags:";
* @Param String Where will be posted inserted text ( default: $_SERVER["PHP_SELF"] )
* @Param String Submit text value ( default: SEND )
* @Param String Method to send form ( default: POST )
*/
function form($action = "", $value = "SEND", $method = "POST") {
$action = $action == "" ? $_SERVER["PHP_SELF"] : $action;
$form_auto = $this->jsLighter."
<FORM CLASS=\"codeLighterAutoForm\" name=\"codeLighterFormName\" METHOD=\"{$method}\" ACTION=\"{$action}\" ENCTYPE=\"multipart/form-data\">
<DIV STYLE=\"padding: 0px;\">".$this->textareaButtons.$this->textarea."<br />
<input class=\"codeLighterButton\" type=\"submit\" value=\"{$value}\" />
<span class=\"codeLighterSpan\">[ ".$this->textarea_check."</span>
<span id=\"codeLighterTextareaSpanChecker\" class=\"codeLighterSpan\">0</span>
<span class=\"codeLighterSpan\"> ]</span>
<span class=\"codeLighterSpan\"> [ </span>
<span id=\"codeLighterTextareaSpanCounter\" class=\"codeLighterSpan\">0</span>
<span class=\"codeLighterSpan\"> ]</span></DIV>
</FORM>
";
return $form_auto;
}
/**
* Public, choose what tag you want enable / parse
*
* $codeLighter->restrict($restrict_array);
* With this function you can specify what kind of tags you want to parse
*
* Example:
* $restrict_array = Array("code", "b");
* $codeLighter->restrict($restrict_array);
* // will parse only [code] or [b]
* @Param Array Parse tags list
*/
function restrict($restrict_array) {
if(!is_Array($restrict_array)) {
$restrict_array = Array( strtolower($restrict_array) );
}
$this->restriction = $restrict_array;
for($a=0; $a<count($this->restriction); $a++) {
$this->restriction[$a] = strtolower($this->restriction[$a]);
}
return true;
}
}
?>