/** * Расстановка защищенных тегов параграфа (<p>...</p>) и переноса строки * * @return void */ protected function build_paragraphs() { $r = mb_strpos($this->_text, '<' . self::BASE64_PARAGRAPH_TAG . '>'); $p = EMT_Lib::rstrpos($this->_text, '</' . self::BASE64_PARAGRAPH_TAG . '>'); if ($r !== false && $p !== false) { $beg = mb_substr($this->_text, 0, $r); $end = mb_substr($this->_text, $p + mb_strlen('</' . self::BASE64_PARAGRAPH_TAG . '>')); $this->_text = (trim($beg) ? $this->do_paragraphs($beg) . "\n" : "") . '<' . self::BASE64_PARAGRAPH_TAG . '>' . mb_substr($this->_text, $r + mb_strlen('<' . self::BASE64_PARAGRAPH_TAG . '>'), $p - ($r + mb_strlen('<' . self::BASE64_PARAGRAPH_TAG . '>'))) . '</' . self::BASE64_PARAGRAPH_TAG . '>' . (trim($end) ? "\n" . $this->do_paragraphs($end) : ""); } else { $this->_text = $this->do_paragraphs($this->_text); } }
/** * Установить настройку * * @param mixed $selector * @param string $setting * @param mixed $value */ protected function doset($selector, $key, $value) { $tret_pattern = false; $rule_pattern = false; //if(($selector === false) || ($selector === null) || ($selector === false) || ($selector === "*")) $type = 0; if (is_string($selector)) { if (strpos($selector, ".") === false) { $tret_pattern = $selector; } else { $pa = explode(".", $selector); $tret_pattern = $pa[0]; array_shift($pa); $rule_pattern = implode(".", $pa); } } EMT_Lib::_process_selector_pattern($tret_pattern); EMT_Lib::_process_selector_pattern($rule_pattern); if ($selector == "*") { $this->settings[$key] = $value; } foreach ($this->trets as $tret) { $t1 = $this->get_short_tret($tret); if (!EMT_Lib::_test_pattern($tret_pattern, $t1)) { if (!EMT_Lib::_test_pattern($tret_pattern, $tret)) { continue; } } $tret_obj = $this->get_tret($tret); if ($key == "active") { foreach ($tret_obj->rules as $rulename => $v) { if (!EMT_Lib::_test_pattern($rule_pattern, $rulename)) { continue; } if (strtolower($value) === "on" || $value === 1 || $value === true || $value == "1") { $tret_obj->enable_rule($rulename); } if (strtolower($value) === "off" || $value === 0 || $value === false || $value == "0") { $tret_obj->disable_rule($rulename); } } } else { if ($rule_pattern === false) { $tret_obj->set($key, $value); } else { foreach ($tret_obj->rules as $rulename => $v) { if (!EMT_Lib::_test_pattern($rule_pattern, $rulename)) { continue; } $tret_obj->set_rule($rulename, $key, $value); } } } } }
protected function build_sub_quotations() { global $__ax, $__ay; $exp = strpos($this->_text, "</cA===>") !== false ? "</cA===>" : (strpos($this->_text, "\r\n") !== false ? "\r\n\r\n" : "\n\n"); $texts_in = explode($exp, $this->_text); $texts_out = array(); foreach ($texts_in as $textx) { $okposstack = array('0'); $okpos = 0; $level = 0; $off = 0; while (true) { $p = EMT_Lib::strpos_ex($textx, array("«", "»"), $off); if ($p === false) { break; } if ($p['str'] == "«") { if ($level > 0) { if (!$this->is_on('no_bdquotes')) { $this->inject_in($p['pos'], self::QUOTE_CRAWSE_OPEN, $textx); } } $level++; } if ($p['str'] == "»") { $level--; if ($level > 0) { if (!$this->is_on('no_bdquotes')) { $this->inject_in($p['pos'], self::QUOTE_CRAWSE_CLOSE, $textx); } } } $off = $p['pos'] + strlen($p['str']); if ($level == 0) { $okpos = $off; array_push($okposstack, $okpos); } elseif ($level < 0) { if (!$this->is_on('no_inches')) { do { $lokpos = array_pop($okposstack); $k = substr($textx, $lokpos, $off - $lokpos); $k = str_replace(self::QUOTE_CRAWSE_OPEN, self::QUOTE_FIRS_OPEN, $k); $k = str_replace(self::QUOTE_CRAWSE_CLOSE, self::QUOTE_FIRS_CLOSE, $k); //$k = preg_replace("/(^|[^0-9])([0-9]+)\»\;/ui", '\1\2″', $k, 1, $amount); $amount = 0; $__ax = preg_match_all("/(^|[^0-9])([0-9]+)\\»\\;/ui", $k, $m); $__ay = 0; if ($__ax) { $k = preg_replace_callback("/(^|[^0-9])([0-9]+)\\»\\;/ui", create_function('$m', 'global $__ax,$__ay; $__ay++; if($__ay==$__ax){ return $m[1].$m[2]."″";} return $m[0];'), $k); $amount = 1; } } while ($amount == 0 && count($okposstack)); // успешно сделали замену if ($amount == 1) { // заново просмотрим содержимое $textx = substr($textx, 0, $lokpos) . $k . substr($textx, $off); $off = $lokpos; $level = 0; continue; } // иначе просто заменим последнюю явно на " от отчаяния if ($amount == 0) { // говорим, что всё в порядке $level = 0; $textx = substr($textx, 0, $p['pos']) . '"' . substr($textx, $off); $off = $p['pos'] + strlen('"'); $okposstack = array($off); continue; } } } } // не совпало количество, отменяем все подкавычки if ($level != 0) { // закрывающих меньше, чем надо if ($level > 0) { $k = substr($textx, $okpos); $k = str_replace(self::QUOTE_CRAWSE_OPEN, self::QUOTE_FIRS_OPEN, $k); $k = str_replace(self::QUOTE_CRAWSE_CLOSE, self::QUOTE_FIRS_CLOSE, $k); $textx = substr($textx, 0, $okpos) . $k; } } $texts_out[] = $textx; } $this->_text = implode($exp, $texts_out); }
HTML , null, "Двойная кавычка перед двоеточием", array('Text.paragraphs' => 'off', 'OptAlign.all' => 'off')); $tester->add_test(<<<HTML Проектирование молниезащиты с помощью ПО Model Studio CS Молниезащита HTML , <<<HTML Проектирование молниезащиты с помощью ПО Model Studio CS Молниезащита HTML , null, "Инициалы проставляются при англ/рус названии сокращении ", array('Text.paragraphs' => 'off', 'OptAlign.all' => 'off')); $tester->add_test("Император Николай II ест.", "Император Николай II ест.", null, "Инициалы смешанные.", array('Text.paragraphs' => 'off', 'OptAlign.all' => 'off')); $tester->add_test("hl2.gamingsource.co.uk", "hl2.gamingsource.co.uk", null, "Обработка домена 1", array('Text.paragraphs' => 'off', 'OptAlign.all' => 'off')); $tester->add_test("showme.info", "showme.info", null, "Обработка домена 2", array('Text.paragraphs' => 'off', 'OptAlign.all' => 'off')); $tester->add_test("Framework.NET", "Framework.NET", null, "Обработка домена 3", array('Text.paragraphs' => 'off', 'OptAlign.all' => 'off')); $tester->add_test("сообщила корреспонденту сайта XXX.RU Лариса Федоровна", "сообщила корреспонденту сайта XXX.RU Лариса Федоровна", null, "Баг проставления иницаилов при использовании домена", array('Text.paragraphs' => 'off', 'OptAlign.all' => 'off')); $tester->add_test("Температура достигала -20... -30 градусов Цельсия.", "Температура достигала −20… −30 градусов Цельсия.", null, "Преобразование в юникод", array('Text.paragraphs' => 'off', 'OptAlign.all' => 'off', 'Etc.unicode_convert' => 'on')); $tester->add_test("и тд и тп.", "и" . EMT_Lib::html_char_entity_to_unicode('nbsp') . "т." . EMT_Lib::html_char_entity_to_unicode('nbsp') . "д. и" . EMT_Lib::html_char_entity_to_unicode('nbsp') . "т." . EMT_Lib::html_char_entity_to_unicode('nbsp') . "п.", null, "Преобразование в юникод с nobr", array('Text.paragraphs' => 'off', 'OptAlign.all' => 'off', 'Etc.unicode_convert' => 'on')); $tester->add_test("и тд и тп.", "<nobr>и т. д.</nobr> <nobr>и т. п.</nobr>", null, "Преобразование в юникод с отключённым nobr", array('Text.paragraphs' => 'off', 'OptAlign.all' => 'off', 'Etc.unicode_convert' => 'on', 'Etc.nobr_to_nbsp' => 'off')); $tester->add_test("интервью для «Афиши+»", "интервью для «Афиши+»", null, "Закрывающая кавычка в конце", array('Text.paragraphs' => 'off', 'OptAlign.all' => 'off')); $tester->add_test("интервью для «Афиши+» вот", "интервью для «Афиши+» вот", null, "Закрывающая кавычка после +", array('Text.paragraphs' => 'off', 'OptAlign.all' => 'off')); $tester->add_test("ООО Компания «Рога и копыта»<br/>\nСтарый и надежный партнер", "ООО Компания «Рога и копыта»<br/>\nСтарый и надежный партнер", null, "Закрывающая кавычка перед тэгом", array('Text.paragraphs' => 'off', 'OptAlign.all' => 'off', 'Text.breakline' => 'off')); $tester->add_test("«\"M**********r\" — это песня об ответственности. Поэтому очень символично, что именно она стала первым синглом с альбома, за который\nмы сами несем полную ответственность», — заявил клавишник группы Родди Боттум.", "«„M**********r“ — это песня об ответственности. Поэтому очень символично, что именно она стала первым синглом с альбома, за который<br />\nмы сами несем полную ответственность», — заявил клавишник группы Родди Боттум.", null, "Две открывающие кавычки подряд", array('Text.paragraphs' => 'off', 'OptAlign.all' => 'off')); $tester->add_test("«Веселье в Акапулькó» крутое. Спецсимвол \"Последний символ ASCII таблицы - ¥\".", "«Веселье в Акапулькó» крутое. Спецсимвол «Последний символ ASCII таблицы — ¥».", null, "Закрывающая кавычка после спец символов.", array('Text.paragraphs' => 'off', 'OptAlign.all' => 'off')); $tester->add_test("«Иероглиф " . EMT_Lib::_getUnicodeChar(0x2fc7) . "\" и «Иероглиф " . EMT_Lib::_getUnicodeChar(0x3042) . "\".", "«Иероглиф " . EMT_Lib::_getUnicodeChar(0x2fc7) . "» и «Иероглиф " . EMT_Lib::_getUnicodeChar(0x3042) . "».", null, "Закрывающая кавычка после иероглифов.", array('Text.paragraphs' => 'off', 'OptAlign.all' => 'off')); $tester->add_test("«В пролете”", "«В пролете»", null, "Баг с rdquo.", array('Text.paragraphs' => 'off', 'OptAlign.all' => 'off')); $tester->add_test(<<<TEXT (С) 1999-2003г., ООО "Фирма "Эдельвейс". Все права защищены. Она добавила: "И цвет мой самый любимый - "эсмеральда"". TEXT , "<p>© 1999—2003 гг., ООО «Фирма «Эдельвейс». Все права защищены.</p>\n<p>Она добавила: «И цвет мой самый любимый — „эсмеральда“».</p>", null, "Обработка неправильных кавычек в разных параграфах", array('OptAlign.all' => 'off')); $tester->add_test("15 мм", "<p>15 мм</p>", null, "Повтороное типографирование не вставляет пробел", array('OptAlign.all' => 'off'));
/** * Создание защищенного тега с содержимым * * @see EMT_lib::build_safe_tag * @param string $content * @param string $tag * @param array $attribute * @return string */ protected function tag($content, $tag = 'span', $attribute = array()) { if (isset($attribute['class'])) { $classname = $attribute['class']; if ($classname == "nowrap") { if (!$this->is_on('nowrap')) { $tag = "nobr"; $attribute = array(); $classname = ""; } } if (isset($this->classes[$classname])) { $style_inline = $this->classes[$classname]; if ($style_inline) { $attribute['__style'] = $style_inline; } } $classname = isset($this->class_names[$classname]) ? $this->class_names[$classname] : $classname; $classname = ($this->class_layout_prefix ? $this->class_layout_prefix : "") . $classname; $attribute['class'] = $classname; } return EMT_Lib::build_safe_tag($content, $tag, $attribute, $this->use_layout === false ? EMT_Lib::LAYOUT_STYLE : $this->use_layout); }
/** * Кодирует спец блок * * @param string $text * @return string */ public static function iblock($text) { return EMT_Lib::INTERNAL_BLOCK_OPEN . EMT_Lib::encrypt_tag($text) . EMT_Lib::INTERNAL_BLOCK_CLOSE; }