--- db/prgsrc/drupal/modules/chgk_db/classes/DbField.class.php 2010/02/28 20:17:33 1.1
+++ db/prgsrc/drupal/modules/chgk_db/classes/DbField.class.php 2010/04/24 21:45:50 1.9
@@ -4,38 +4,193 @@ require_once(dirname(__FILE__)."/DbField
class DbField {
private $field;
- private $value;
- private $number;
- private $html;
- public function __construct($field, $value, $number = false) {
+ 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->getHtml();
+ $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] =
+ ''.$this->getName().
+ ': '. $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 .= "\n";
+ }
+ if (in_array($k, $codeStarts)) {
+ $incode = TRUE;
+ $result .= "\n";
+ }
+
+ if ($incode) {
+ $result .= "$p\n";
+ } elseif ($inpoem) {
+ $result.="$p\n";
+ } else {
+ $result.="$p
\n";
+ }
+ if (in_array($k, $poemEnds)) {
+ $result .= "";
+
+ $inpoem = FALSE;
+ }
+
+ if (in_array($k, $codeEnds)) {
+ $incode = FALSE;
+ $result .= "\n";
+ }
+
+ }
+ $this->fb2 = $result;
+// $this->fb2 = preg_replace('/ -+(\s+)/',' —$1', $this->fb2);
+ $this->fb2 = preg_replace('/\(pic: ([^\)]*)\)/','', $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—$2', $this->html);
+
+ $this->html = preg_replace('/\[Раздаточный материал:(.*?)\]\s*\n/sm',
+ "
\\1
\n",
+ $this->html );
+ $this->html = preg_replace('/^\s*<раздатка>(.*?)<\/раздатка>/sm',
+ " \\1
\n",
+ $this->html );
+
$this->html = preg_replace('/^\s+/m', "
\n ", $this->html);
- if (!preg_match('/^\|/m')) {
+ if (!preg_match('/^\|/m',$this->html)) {
$this->html = preg_replace('/\s+\/m',' \', $this->html);
- }
-
+ }
$this->html = preg_replace('/\(pic: ([^\)]*)\)/','', $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",
+ '$0', $this->html);
+ } else {
+ $this->html = str_replace($term, ''.$term."", $this->html);
+ }
+ }
+ }
+
public function getName() {
return $this->field;
}
@@ -46,5 +201,23 @@ class DbField {
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();
+ }
}