За последние 24 часа нас посетили 17674 программиста и 1595 роботов. Сейчас ищут 1638 программистов ...

Классик для обработки бибикодов

Тема в разделе "Решения, алгоритмы", создана пользователем Hight, 28 дек 2008.

  1. Hight

    Hight Старожил
    Команда форума Модератор

    С нами с:
    5 мар 2006
    Сообщения:
    7.153
    Симпатии:
    0
    Адрес:
    из злой параллельной вселенной
  2. antonn

    antonn Активный пользователь

    С нами с:
    10 июн 2007
    Сообщения:
    2.996
    Симпатии:
    0
    у cite вложенности нет
     
  3. Hight

    Hight Старожил
    Команда форума Модератор

    С нами с:
    5 мар 2006
    Сообщения:
    7.153
    Симпатии:
    0
    Адрес:
    из злой параллельной вселенной
    и не должно быть :) вложенность есть в quote
     
  4. Mr.M.I.T.

    Mr.M.I.T. Старожил

    С нами с:
    28 янв 2008
    Сообщения:
    4.586
    Симпатии:
    1
    Адрес:
    у тебя канфетка?
    какие бб коды без меня?
    и йа участвую
    PHP:
    1.  
    2. <?
    3. class bbcodes {
    4.    public static $cnf=array();
    5.    public $ident,$bbdata_reg,$bbdata_rep,$tags,$rep;
    6.    
    7.    function __construct($ident,$cnf=0) {
    8.        if($cnf)self::$cnf=$cnf;
    9.        if(!self::$cnf)
    10.           trigger_error("Ошибка: Переменная конфигурации не определена",E_USER_ERROR);
    11.        $this->ident=$ident;
    12.        $this->ChanceCheckBBData();
    13.    }
    14.    private function ChanceCheckBBData(){
    15.        if($this->Is_BBData()){
    16.            include $this->GetBBDir();
    17.            $this->bbdata_reg=$data['reg'];
    18.            $this->bbdata_rep=$data['rep'];
    19.        }
    20.        return false;
    21.    }
    22.    function Is_BBData() {
    23.        if(file_exists($this->GetBBDir()))
    24.           return true;
    25.        return false;
    26.    }
    27.    function BBSet($tag,$attr=0) {
    28.       if(!is_array($tag)) {
    29.          $this->tags[]=array($tag,$attr);
    30.       }else{
    31.          foreach($tag as $key=>$val){
    32.              if(is_numeric($key))
    33.                $this->BBSet($val);
    34.              else
    35.                $this->BBSet($key,$val);
    36.          }
    37.       }
    38.    }
    39.    function RepSet($tag,$attr=0) {
    40.       if(!is_array($tag)) {
    41.          $this->rep[]=array($tag,$attr);
    42.       }else{
    43.          foreach($tag as $key=>$val){
    44.              if(is_numeric($key))
    45.                $this->RepSet($val);
    46.              else
    47.                $this->RepSet($key,$val);
    48.          }
    49.       }
    50.    }
    51.    function BBParse($text){
    52.        if($this->tags && $this->rep &&
    53.          (!$this->bbdata_rep || !$this->bbdata_reg))
    54.              $this->CompileRegular();
    55.        $text=preg_replace($this->bbdata_reg['is'],$this->bbdata_rep['is'],$text);
    56.        return $text;
    57.    }
    58.    function R_BBParse($text){
    59.        if($this->tags && $this->rep &&
    60.          (!$this->bbdata_rep || !$this->bbdata_reg))
    61.              $this->CompileRegular();
    62.        $text=preg_replace($this->bbdata_reg['re'],$this->bbdata_rep['re'],$text);
    63.        return $text;
    64.    }
    65.    private function CompileRegular(){
    66.        for($i=0,$c=count($this->tags);$i<$c;$i++){
    67.            $regsum=array();$z=1;
    68.            $tag='#\['.quotemeta($this->tags[$i][0]);
    69.            $retag="[".$this->tags[$i][0];
    70.            if(is_array($attr=$this->tags[$i][1])){
    71.              if(in_array('MainAttr',$attr)){
    72.                 $tag.="\=(.+?)";
    73.                 $retag.="=\\1";
    74.                 $regsum['to'][]="{MainAttr}";
    75.                 $regsum['on'][]="\\1";
    76.                 $z++;
    77.              }
    78.               foreach($attr as $key=>$val){
    79.                  if($val=='MainAttr') continue;
    80.                  $tag.="[\s]+$val\=(.+?)";
    81.                  $retag.=" ".$val."=\\".$z;
    82.                  $regsum['to'][]="{".$val."}";
    83.                  $regsum['on'][]="\\".$z;
    84.                  $z++;
    85.               }
    86.            }
    87.            $tag.="\](?s)(.+?)\[\/".quotemeta($this->tags[$i][0])."\]#i";
    88.            $retag.=']\\'.$z.'[/'.$this->tags[$i][0].']';
    89.            $this->bbdata_reg['is'][]=$tag;
    90.            $this->bbdata_rep['re'][]=$retag;
    91.  
    92.            $tag=$this->rep[$i][0];
    93.            $attr=$this->rep[$i][1];
    94.            $reptag="<$tag";
    95.            $rereptag="#<".quotemeta($tag);
    96.             if($attr) {
    97.                $reptag.=" ".$attr;
    98.                $reptag=str_replace($regsum['to'],$regsum['on'],$reptag);
    99.                $rereptag.=" ".preg_replace("#{(.+)}#iU","(.+?)",quotemeta($attr));
    100.             }
    101.            $reptag.=">\\".$z."</".$tag.">";
    102.            $rereptag.=">(?s)(.+?)<\/".quotemeta($tag).">#i";
    103.            $this->bbdata_rep['is'][]=$reptag;
    104.            $this->bbdata_reg['re'][]=$rereptag;
    105.        }
    106.    }
    107.    function Clear($ident=0){
    108.        if(!$ident) $ident=$this->ident;
    109.        $dir=$this->GetBBDir();
    110.        if(file_exists($dir)){
    111.           if(unlink($dir)){
    112.               $this->bbdata_reg='';
    113.               $this->bbdata_rep='';
    114.               return true;
    115.           }
    116.        }
    117.        return false;
    118.    }
    119.    private function GetBBDir(){
    120.        return $_SERVER['DOCUMENT_ROOT'].'/'.self::$cnf['bb_data_dir'].'/'.$this->ident.".php";
    121.    }
    122.    function __destruct() {
    123.        $dir=$this->GetBBDir();
    124.        if(!file_exists($dir) && $this->bbdata_reg && $this->bbdata_rep) {
    125.            $out="<?\$data['reg']=".var_export($this->bbdata_reg,1).";
    126.                \$data['rep']=".var_export($this->bbdata_rep,1).";?".">";
    127.            file_put_contents($dir,$out);
    128.        }
    129.    }
    130. }
    131.  bbcodes::$cnf=array("bb_data_dir"=>"bbcodes");
    132.  $bb=new bbcodes("newbb");
    133.  $bb->BBSet(array(
    134.             "b","size"=>array("MainAttr"),
    135.             "align"=>array("MainAttr","color"),
    136.               ));
    137.  $bb->RepSet(array(
    138.             "b","font"=>"style='font-size:{MainAttr}px'",
    139.             "div"=>"align='{MainAttr}' style='color:{color};'"
    140.               ));
    141.  // ЗНАК '-' В ББ КОДАХ УБРАТЬ
    142.  $v=$bb->BBParse("
    143.    dfsdfsdfsdf
    144.    sf[-b]sdfsdfs[/b]df
    145.    sd[-align=center color=red]fsdfsdfsdfsdfsdf[/align]
    146.    s[-size=25]dfsdfs[/size]df
    147. ");
    148.  print "BB:".$v."<br>";
    149.  print "REE: ".$bb->R_BBParse($v);
    150. ?>
    151.  
    кстати почему у меня не заработало именное сохранение?
    (?<Name>RegExp)
     
  5. Hight

    Hight Старожил
    Команда форума Модератор

    С нами с:
    5 мар 2006
    Сообщения:
    7.153
    Симпатии:
    0
    Адрес:
    из злой параллельной вселенной
    Mr.M.I.T.
    Блин, не могу твою кашу разобрать. Ты бы лучше где-нибудь страничку с тестом этого дела сделал для наглядности и исходники выложил в архивчике. А то тут с этой подсветкой глаза сломать можно.
     
  6. Mr.M.I.T.

    Mr.M.I.T. Старожил

    С нами с:
    28 янв 2008
    Сообщения:
    4.586
    Симпатии:
    1
    Адрес:
    у тебя канфетка?
    Hight
    лень
    вот же примерчик
    PHP:
    1. <?
    2. bbcodes::$cnf=array("bb_data_dir"=>"bbcodes");
    3.   $bb=new bbcodes("newbb");
    4.   $bb->BBSet(array(
    5.              "b","size"=>array("MainAttr"),
    6.              "align"=>array("MainAttr","color"),
    7.                ));
    8.   $bb->RepSet(array(
    9.              "b","font"=>"style='font-size:{MainAttr}px'",
    10.              "div"=>"align='{MainAttr}' style='color:{color};'"
    11.                ));
    12.   // ЗНАК '-' В ББ КОДАХ УБРАТЬ
    13.   $v=$bb->BBParse("
    14.     dfsdfsdfsdf
    15.     sf[-b]sdfsdfs[/b]df
    16.     sd[-align=center color=red]fsdfsdfsdfsdfsdf[/align]
    17.     s[-size=25]dfsdfs[/size]df
    18.  ");
    19.   print "BB:".$v."<br>";
    20.   print "REE: ".$bb->R_BBParse($v);
    21. ?>
    а мне кстати подсветка нравится, лучше чем у меня в редакторе =)
     
  7. Hight

    Hight Старожил
    Команда форума Модератор

    С нами с:
    5 мар 2006
    Сообщения:
    7.153
    Симпатии:
    0
    Адрес:
    из злой параллельной вселенной
    А у меня синглетон видел?! :) Удобная штука. Ещё думаю научить свой классик видео на страничке показывать.