File:  [Local Repository] / db / prgsrc / drupal / modules / chgk_db / classes / DbField.class.php
Revision 1.9: download - view: text, annotated - select for diffs - revision graph
Sat Apr 24 21:45:50 2010 UTC (14 years ago) by roma7
Branches: MAIN
CVS tags: HEAD
Version 2 big update

<?php

require_once(dirname(__FILE__)."/DbField/DbFieldQuestion.class.php");

class DbField {
  private $field;
  protected $value; 
  protected $number;
  protected $html;
  protected $paragraphs;
  protected $fb2;
  protected $poems;
  protected $codes;
  protected $searchString;
  protected $parent;

  public function __construct($field, $value, $number = false, $parent = null) {
    $this->field = $field;
    $this->value = $value;
    $this->number = $number;
    $this->parent = $parent;
  }

  
  public function getHtml() {
    
    if ($this->html) {
      return $this->html;
    }

    $this->html = $this->value;
    $this->formatHtml();
    return $this->html;
  }

  protected function updateFirstParagraph() {
    $this->paragraphs[0] =
            '<strong>'.$this->getName().
            ':</strong> '. $this->paragraphs[0];
  }
  public function getFb2() {
    if ($this->fb2) {
      return $this->fb2;
    }    
    $this->fb2 = $this->value;
    $this->fb2 = html_entity_decode($this->fb2, ENT_COMPAT, 'UTF-8');
    $this->fb2 = htmlspecialchars($this->fb2, ENT_NOQUOTES, 'UTF-8');
    $this->split();
    $this->updateFirstParagraph();
    $poemStarts = $poemEnds = array();
    $codeStarts = $codeEnds = array();

    foreach ($this->poems as $p) {
        list($b, $e) = $p;
        $poemStarts[] = $b;
        $poemEnds[] = $e;
    }

    foreach ($this->codes as $p) {
        list($b, $e) = $p;
        $codeStarts[] = $b;
        $codeEnds[] = $e;
    }

    $inpoem = FALSE;
    $incode = FALSE;
    $result = '';
    foreach ($this->paragraphs as $k=>$p) {
        if (in_array($k, $poemStarts)) {
            $inpoem = TRUE;
            $result .= "<poem><stranza>\n";
        }
        if (in_array($k, $codeStarts)) {
            $incode = TRUE;
            $result .= "<poem><stranza>\n";
        }

        if ($incode) {
            $result .= "<v>$p</v>\n";
        }    elseif ($inpoem) {
            $result.="<v>$p</v>\n";
        } else {
            $result.="<p>$p</p>\n";
        }
        if (in_array($k, $poemEnds)) {
            $result .= "</stranza></poem>";

            $inpoem = FALSE;
        }

        if (in_array($k, $codeEnds)) {
            $incode = FALSE;
            $result .= "</stranza></poem>\n";
        }

    }
    $this->fb2 = $result;
//    $this->fb2 = preg_replace('/ -+(\s+)/','&nbsp;&mdash;$1', $this->fb2);
    $this->fb2 = preg_replace('/\(pic: ([^\)]*)\)/','<image l:href="#$1" />', $this->fb2);
    return $this->fb2;
  }

  protected function split() {
      $lines = split ("\n", $this->fb2);
      $this->paragraphs = array();
      $current = '';
      foreach ($lines as $l) {
          if (preg_match('/^[\s\|]/', $l)) {
              $this->paragraphs[] = $current;
              $current = $l ."\n";
          }  else {
             $current .= $l."\n" ;
          }
      }
     $this->paragraphs[] = $current;
     $sp = '';
     $begin = $end = 0;
     $incode = FALSE;
     $this->poems = array();
     $this->codes = array();
     foreach ($this->paragraphs as $k=>$p) {
         if (preg_match('/^\|/', $p )) {
            $this->paragraphs[$k] = preg_replace('/^\|/', '',
                    $this->paragraphs[$k]);
            if (!$incode) {
                $cbegin = $k;
                $incode = TRUE;
            }
         } else {
             if ($incode) {
                $this->codes[] = array($cbegin, $k);
             }
             $incode = FALSE;
         }
        $csp = preg_replace('/\S.*/', '', $p);
        if ($csp == $sp) {
            $end = $k;
        }
        else {
            if ($begin!=$end && $csp) {
                $this->poems[] = array($begin, $end);
            }
            $begin = $end = $k;
            $sp = $csp;
        }
     }
     if ($incode) {
          $this->codes[] = array($cbegin, $k);
     }

     if ($begin!=$end && $csp) {
        $this->poems[] = array($begin, $end);
     }
  }

  public function formatHtml() {
    $this->html = preg_replace('/(\s+)-+(\s+)/','\1&mdash;$2', $this->html);
  
    $this->html = preg_replace('/\[Раздаточный материал:(.*?)\]\s*\n/sm',
        "<div class=\"razdatka\"><div class=\"razdatka_header\">Раздаточный материал</div> \\1</div>\n",
         $this->html  );
    $this->html = preg_replace('/^\s*<раздатка>(.*?)<\/раздатка>/sm',
        "<div class=\"razdatka\"><div class=\"razdatka_header\">Раздаточный материал</div> \\1</div>\n",
         $this->html  );

    $this->html = preg_replace('/^\s+/m', "<br>\n&nbsp;&nbsp;&nbsp;&nbsp;", $this->html);  

    if (!preg_match('/^\|/m',$this->html)) {
      $this->html = preg_replace('/\s+\&#0150/m','&nbsp;\&#0150', $this->html);
    } 
    $this->html = preg_replace('/\(pic: ([^\)]*)\)/','<p><img src="/images/db/$1"></p>', $this->html);

    if ($this->getSearchString()) {
        $this->highLight();
    }    
  }
  
  protected function highLight() {
      $sstr = $this->getSearchString();
      setlocale(LC_ALL, 'ru_RU.utf8');
      preg_match_all('/[\wа-я]{4,}\*?/iu', $sstr, $matchs);
      $terms= $matchs[0];
      foreach ($terms as $term) {
        if ( preg_match('/\*$/', $term) ) {
           $letters=preg_replace('/\*/', '', $term);
           $this->html = preg_replace("/{$letters}[\wа-я]*/iu",
                   '<strong>$0</strong>', $this->html);
        } else {
           $this->html = str_replace($term, '<strong>'.$term."</strong>", $this->html);
        }
      }
  }

  public function getName() {
    return $this->field;
  }

  public function getNumber() {
    return $this->number;
  }

  public function isEmpty() {
    return $this->value === NULL || $this->value==='';
  } 
  
  public function getValue() {
    return $this->value;
  }

  public function getImages() {
      $m = preg_match_all('/\(pic:\s*(.*?)\)/', $this->value,
              $matches, PREG_PATTERN_ORDER);
     $this->images =  $matches[1];
      return $this->images;
  }

  public function getSearchString() {
    if (!$this->parent) {
        return '';
    }
    return $this->parent->getSearchString();
  }
}

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>