Annotation of db/prgsrc/drupal/modules/chgk_db/classes/DbField.class.php, revision 1.9

1.1       roma7       1: <?php
                      2: 
                      3: require_once(dirname(__FILE__)."/DbField/DbFieldQuestion.class.php");
                      4: 
                      5: class DbField {
                      6:   private $field;
1.3       roma7       7:   protected $value; 
1.5       roma7       8:   protected $number;
                      9:   protected $html;
1.7       roma7      10:   protected $paragraphs;
                     11:   protected $fb2;
                     12:   protected $poems;
                     13:   protected $codes;
1.9     ! roma7      14:   protected $searchString;
        !            15:   protected $parent;
1.7       roma7      16: 
1.9     ! roma7      17:   public function __construct($field, $value, $number = false, $parent = null) {
1.1       roma7      18:     $this->field = $field;
                     19:     $this->value = $value;
                     20:     $this->number = $number;
1.9     ! roma7      21:     $this->parent = $parent;
1.1       roma7      22:   }
                     23: 
                     24:   
                     25:   public function getHtml() {
1.9     ! roma7      26:     
1.1       roma7      27:     if ($this->html) {
                     28:       return $this->html;
1.9     ! roma7      29:     }
        !            30: 
1.1       roma7      31:     $this->html = $this->value;
                     32:     $this->formatHtml();
                     33:     return $this->html;
                     34:   }
1.6       roma7      35: 
                     36:   protected function updateFirstParagraph() {
                     37:     $this->paragraphs[0] =
                     38:             '<strong>'.$this->getName().
                     39:             ':</strong> '. $this->paragraphs[0];
                     40:   }
                     41:   public function getFb2() {
                     42:     if ($this->fb2) {
                     43:       return $this->fb2;
                     44:     }    
                     45:     $this->fb2 = $this->value;
                     46:     $this->fb2 = html_entity_decode($this->fb2, ENT_COMPAT, 'UTF-8');
                     47:     $this->fb2 = htmlspecialchars($this->fb2, ENT_NOQUOTES, 'UTF-8');
                     48:     $this->split();
                     49:     $this->updateFirstParagraph();
                     50:     $poemStarts = $poemEnds = array();
                     51:     $codeStarts = $codeEnds = array();
                     52: 
                     53:     foreach ($this->poems as $p) {
                     54:         list($b, $e) = $p;
                     55:         $poemStarts[] = $b;
                     56:         $poemEnds[] = $e;
                     57:     }
                     58: 
                     59:     foreach ($this->codes as $p) {
                     60:         list($b, $e) = $p;
                     61:         $codeStarts[] = $b;
                     62:         $codeEnds[] = $e;
                     63:     }
                     64: 
                     65:     $inpoem = FALSE;
                     66:     $incode = FALSE;
                     67:     $result = '';
                     68:     foreach ($this->paragraphs as $k=>$p) {
                     69:         if (in_array($k, $poemStarts)) {
                     70:             $inpoem = TRUE;
                     71:             $result .= "<poem><stranza>\n";
                     72:         }
                     73:         if (in_array($k, $codeStarts)) {
                     74:             $incode = TRUE;
                     75:             $result .= "<poem><stranza>\n";
                     76:         }
                     77: 
                     78:         if ($incode) {
                     79:             $result .= "<v>$p</v>\n";
                     80:         }    elseif ($inpoem) {
                     81:             $result.="<v>$p</v>\n";
                     82:         } else {
                     83:             $result.="<p>$p</p>\n";
                     84:         }
                     85:         if (in_array($k, $poemEnds)) {
                     86:             $result .= "</stranza></poem>";
                     87: 
                     88:             $inpoem = FALSE;
                     89:         }
                     90: 
                     91:         if (in_array($k, $codeEnds)) {
                     92:             $incode = FALSE;
                     93:             $result .= "</stranza></poem>\n";
                     94:         }
                     95: 
                     96:     }
                     97:     $this->fb2 = $result;
1.9     ! roma7      98: //    $this->fb2 = preg_replace('/ -+(\s+)/','&nbsp;&mdash;$1', $this->fb2);
1.6       roma7      99:     $this->fb2 = preg_replace('/\(pic: ([^\)]*)\)/','<image l:href="#$1" />', $this->fb2);
                    100:     return $this->fb2;
                    101:   }
                    102: 
                    103:   protected function split() {
                    104:       $lines = split ("\n", $this->fb2);
                    105:       $this->paragraphs = array();
                    106:       $current = '';
                    107:       foreach ($lines as $l) {
                    108:           if (preg_match('/^[\s\|]/', $l)) {
                    109:               $this->paragraphs[] = $current;
1.8       roma7     110:               $current = $l ."\n";
1.6       roma7     111:           }  else {
                    112:              $current .= $l."\n" ;
                    113:           }
                    114:       }
                    115:      $this->paragraphs[] = $current;
                    116:      $sp = '';
                    117:      $begin = $end = 0;
                    118:      $incode = FALSE;
                    119:      $this->poems = array();
                    120:      $this->codes = array();
                    121:      foreach ($this->paragraphs as $k=>$p) {
                    122:          if (preg_match('/^\|/', $p )) {
                    123:             $this->paragraphs[$k] = preg_replace('/^\|/', '',
                    124:                     $this->paragraphs[$k]);
                    125:             if (!$incode) {
                    126:                 $cbegin = $k;
                    127:                 $incode = TRUE;
                    128:             }
                    129:          } else {
                    130:              if ($incode) {
                    131:                 $this->codes[] = array($cbegin, $k);
                    132:              }
                    133:              $incode = FALSE;
                    134:          }
                    135:         $csp = preg_replace('/\S.*/', '', $p);
                    136:         if ($csp == $sp) {
                    137:             $end = $k;
                    138:         }
                    139:         else {
                    140:             if ($begin!=$end && $csp) {
                    141:                 $this->poems[] = array($begin, $end);
                    142:             }
                    143:             $begin = $end = $k;
                    144:             $sp = $csp;
                    145:         }
                    146:      }
                    147:      if ($incode) {
                    148:           $this->codes[] = array($cbegin, $k);
                    149:      }
                    150: 
                    151:      if ($begin!=$end && $csp) {
                    152:         $this->poems[] = array($begin, $end);
                    153:      }
                    154:   }
                    155: 
1.1       roma7     156:   public function formatHtml() {
1.4       roma7     157:     $this->html = preg_replace('/(\s+)-+(\s+)/','\1&mdash;$2', $this->html);
                    158:   
1.2       roma7     159:     $this->html = preg_replace('/\[Раздаточный материал:(.*?)\]\s*\n/sm',
                    160:         "<div class=\"razdatka\"><div class=\"razdatka_header\">Раздаточный материал</div> \\1</div>\n",
                    161:          $this->html  );
                    162:     $this->html = preg_replace('/^\s*<раздатка>(.*?)<\/раздатка>/sm',
                    163:         "<div class=\"razdatka\"><div class=\"razdatka_header\">Раздаточный материал</div> \\1</div>\n",
                    164:          $this->html  );
                    165: 
1.1       roma7     166:     $this->html = preg_replace('/^\s+/m', "<br>\n&nbsp;&nbsp;&nbsp;&nbsp;", $this->html);  
                    167: 
1.2       roma7     168:     if (!preg_match('/^\|/m',$this->html)) {
1.1       roma7     169:       $this->html = preg_replace('/\s+\&#0150/m','&nbsp;\&#0150', $this->html);
1.2       roma7     170:     } 
1.1       roma7     171:     $this->html = preg_replace('/\(pic: ([^\)]*)\)/','<p><img src="/images/db/$1"></p>', $this->html);
1.9     ! roma7     172: 
        !           173:     if ($this->getSearchString()) {
        !           174:         $this->highLight();
        !           175:     }    
1.1       roma7     176:   }
                    177:   
1.9     ! roma7     178:   protected function highLight() {
        !           179:       $sstr = $this->getSearchString();
        !           180:       setlocale(LC_ALL, 'ru_RU.utf8');
        !           181:       preg_match_all('/[\wа-я]{4,}\*?/iu', $sstr, $matchs);
        !           182:       $terms= $matchs[0];
        !           183:       foreach ($terms as $term) {
        !           184:         if ( preg_match('/\*$/', $term) ) {
        !           185:            $letters=preg_replace('/\*/', '', $term);
        !           186:            $this->html = preg_replace("/{$letters}[\wа-я]*/iu",
        !           187:                    '<strong>$0</strong>', $this->html);
        !           188:         } else {
        !           189:            $this->html = str_replace($term, '<strong>'.$term."</strong>", $this->html);
        !           190:         }
        !           191:       }
        !           192:   }
        !           193: 
1.1       roma7     194:   public function getName() {
                    195:     return $this->field;
                    196:   }
                    197: 
                    198:   public function getNumber() {
                    199:     return $this->number;
                    200:   }
                    201: 
                    202:   public function isEmpty() {
                    203:     return $this->value === NULL || $this->value==='';
1.3       roma7     204:   } 
                    205:   
                    206:   public function getValue() {
                    207:     return $this->value;
                    208:   }
1.6       roma7     209: 
                    210:   public function getImages() {
                    211:       $m = preg_match_all('/\(pic:\s*(.*?)\)/', $this->value,
                    212:               $matches, PREG_PATTERN_ORDER);
                    213:      $this->images =  $matches[1];
                    214:       return $this->images;
                    215:   }
1.9     ! roma7     216: 
        !           217:   public function getSearchString() {
        !           218:     if (!$this->parent) {
        !           219:         return '';
        !           220:     }
        !           221:     return $this->parent->getSearchString();
        !           222:   }
1.1       roma7     223: }

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