
PodglÄ d pliku: / bbcode / bbcode_100RC.phps
<?php
/************************************************** 
 *           Klasa do parsowania BBcode           * 
 ************************************************** 
 * Wersja: 1.0 RC                                 * 
 * Autor: Jacek Kowalski (http://jacekk.info)     * 
 *                                                * 
 * Utwór rozprowadzany na licencji                * 
 * http://creativecommons.org/licenses/by-nc/2.5/ * 
 **************************************************/
// Kodowanie znakow: ISO-8859-2
class bbcode {
    static $simpletags = array(
        'b' => array('<b>', '</b>'),
        'i' => array('<i>', '</i>'),
        'u' => array('<u>', '</u>'),
    );
    static $reqarg = array(
        // [tag=%]
        // 'tag' => array('<znacznik abc="$">', '</znacznik>', 'typ danych do $ = test(%, TYP);');
        'size' => array('<span style="font-size:$%;">', '</span>', 'size'),
        'color' => array('<span style="color:$;">', '</span>', 'color'),
        'bg' => array('<span style="background-color:$;">', '</span>', 'color'),
    );
    
    // Funkcja przechwytująca błędy składniowe w BBCode
    static function error($tekst) {
        echo $tekst;
    }
    
    static function test($tekst, $typ) {
        switch($typ) {
            case 'color':
                $allowed = array('aqua' => '#0FF',    'green' => '#080',    'navy' => '#008',    'silver' => '#C0C0C0',    'black' => '#000',    'grey' => '#888',    'gray' => '#888',    'olive' => '#880',    'teal' => '#088',    'blue' => '#00F',    'lime' => '#0F0',    'purple' => '#808',    'white' => '#FFF',    'fuchsia' => '#F0F',    'maroon' => '#800',    'red' => '#F00',    'yellow' => '#FF0',    'orange' => '#F80',    'pink' => '#F6B',    'violet' => '#93C',    'brown' => '#A22',    'gold' => '#FD0',    'cyan' => '#0FF',    'magenta' => '#F0F');
                if(isset($allowed[$tekst])) {
                    return $allowed[$tekst];
                }
                elseif(substr($tekst, 0, 1)=='#') {
                    $tekst = strtoupper(substr($tekst, 1));
                    if(strlen($tekst) != 3 AND strlen($tekst) != 6) {
                        self::error('Niepoprawny kolor');
                        return FALSE;
                    }
                    else
                    {
                        if(trim($tekst, '0123456789ABCDEF')=='') {
                            return '#'.$tekst;
                        }
                        else
                        {
                            self::error(E_WARNING, 'Niepoprawny kolor');
                            return FALSE;
                        }
                    }
                }
                else
                {
                    self::error(E_WARNING, 'Niepoprawny kolor');
                    return FALSE;
                }
            break;
            case 'size':
                if(!ctype_digit($tekst)) {
                    self::error(E_WARNING, 'Podana wielkość czcionki jest nieprawidłowa (dozwolone tylko cyfry)');
                    return FALSE;
                }
                elseif($tekst<20) {
                    self::error(E_WARNING, 'Zbyt mała wielkość czcionki (miniumum 20%)');
                    return FALSE;
                }
                elseif($tekst>200) {
                    self::error(E_WARNING, 'Zbyt duża wielkość czcionki (maksimum 200%)');
                    return FALSE;
                }
                
                return (int)$tekst;
            break;
        }
    }
    
    static function parse($tekst) {
        $last = 0;
        $opened = array();
        $autoclosed = array();
        
        while(true) {
            $start = @strpos($tekst, '[', $last);
            if($start===FALSE) { break; }
            $end = @strpos($tekst, ']', $start);
            if($end===FALSE) { break; }
            $check = @strpos($tekst, '[', $start+1);
            if($check<$end AND $check!==FALSE) {
                $last = $check;
                continue;
            }
            
            $pre = substr($tekst, 0, $start);
            $post = substr($tekst, $end+1);
            
            $tekst = substr($tekst, $start+1, $end-$start-1);
            $tag = explode('=', strtolower($tekst));
            
            switch(count($tag)) {
                case 1:
                    if(substr($tag[0], 0, 1)=='/') {
                        $tag[0] = substr($tag[0], 1);
                        if(($otag = array_search($tag[0], $autoclosed)) !== FALSE) {
                            // Tag został już zamknięty automatycznie
                            unset($autoclosed[$otag]);
                            break;
                        }
                        elseif(!in_array($tag[0], $opened)) {
                            // Tag nie był otwarty - pomiń
                            $pre .= '['.$tekst.']';
                            break;
                        }
                        else
                        {
                            // Zamykanie tagu i autozamykanie tagów (zła kolejność)
                            while (true) {
                                $otag = array_pop($opened);
                                if($otag===NULL) {
                                    $pre .= '['.$tekst.']';
                                    break;
                                }
                                
                                if(self::$simpletags[$otag]) {
                                    $pre .= self::$simpletags[$otag][1];
                                }
                                else
                                {
                                    $pre .= self::$reqarg[$otag][1];
                                }
                                
                                if($otag != $tag[0]) {
                                    // Tag autozamknięty
                                    array_push($autoclosed, $otag);
                                }
                                else
                                {
                                    // Tag właściwy zamknięty
                                    break;
                                }
                            }
                        }
                    }
                    elseif(self::$simpletags[$tag[0]]) {
                        // Otwieranie tagu
                        $pre .= self::$simpletags[$tag[0]][0];
                        array_push($opened, $tag[0]);
                    }
                    elseif(self::$reqarg[$tag[0]])
                    {
                        // Tag wymaga argumentu - pomiń
                        $pre .= '['.$tekst.']';
                    }
                    else
                    {
                        // Tag nieznany - pomiń
                        $pre .= '['.$tekst.']';
                    }
                break;
                case 2:
                    if(self::$simpletags[$tag[0]]) {
                        // Dany tag nie ma argumentów - pomiń
                        $pre .= '['.$tekst.']';
                    }
                    elseif(self::$reqarg[$tag[0]])
                    {
                        // Otwieranie tagu
                        $value = self::test($tag[1], self::$reqarg[$tag[0]][2]);
                        if($value) {
                            $pre .= str_replace('$', $value, self::$reqarg[$tag[0]][0]);
                            array_push($opened, $tag[0]);
                        }
                    }
                break;
            }
            
            $tekst = $pre.$post;
            $last = strlen($pre);
        }
        
        while (true) {
            $otag = array_pop($opened);
            if($otag===NULL) {
                break;
            }
            
            if(self::$simpletags[$otag]) {
                $tekst .= self::$simpletags[$otag][1];
            }
            else
            {
                $tekst .= self::$reqarg[$otag][1];
            }
        }
        
        return $tekst;
    }
}
?>
Browse Code © 2010 by Jacek Kowalski