/** @return string */ private function content() { return dfc($this, function () { /** @var string $content */ $content = df_trim($this[self::$P__CONTENT], "\n"); return $this->tagIs('pre', 'code') || !df_contains($content, "\n") ? $content : "\n" . df_tab_multiline($content) . "\n"; }); }
/** * @param string $dir * @throws \Df\Core\Exception */ private function mkdir($dir) { try { $r = mkdir($dir, 0777, $recursive = true); df_throw_last_error($r); } catch (\Exception $e) { /** @var bool $isPermissionDenied */ $isPermissionDenied = df_contains($e->getMessage(), 'Permission denied'); df_error($isPermissionDenied ? "Операционная система запретила интерпретатору PHP создание папки «{$dir}»." : "Не удалось создать папку «{$dir}»." . "\nДиагностическое сообщение интерпретатора PHP: «{$e->getMessage()}»."); } }
/** * 2015-11-15 * @override * @see \Magento\Framework\Config\Dom::validate() * @param string $schemaFileName * @param array $errors * @return bool * @throws \Exception */ public function validate($schemaFileName, &$errors = []) { parent::validate($schemaFileName, $errors); $errors = array_filter($errors, function ($message) { /** @var string $message */ // 2015-11-15 // Не отключаем валидацию составного файла полностью, // а лишь убираем их диагностического отчёта сообщения о сбоях в наших полях. return !df_contains($message, 'Element \'df') && !df_contains($message, 'attribute \'df'); }); return !$errors; }
/** * @param string|string[] $text * @param string $charlist [optional] * @return string|string[] */ public function trim($text, $charlist = null) { /** @var string|string $result */ if (is_array($text)) { $result = df_map([$this, __FUNCTION__], $text, $charlist); } else { if (!is_null($charlist)) { /** @var string[] $addionalSymbolsToTrim */ $addionalSymbolsToTrim = ["\n", "\r", ' ']; foreach ($addionalSymbolsToTrim as $addionalSymbolToTrim) { /** @var string $addionalSymbolToTrim */ if (!df_contains($charlist, $addionalSymbolToTrim)) { $charlist .= $addionalSymbolToTrim; } } } /** * Обратите внимание, что класс Zend_Filter_StringTrim может работать некорректно * для строк, заканчивающихся заглавной кириллической буквой «Р». * http://framework.zend.com/issues/browse/ZF-11223 * Однако решение, которое предложено по ссылке выше * (http://framework.zend.com/issues/browse/ZF-11223) * может приводить к падению интерпретатора PHP * для строк, начинающихся с заглавной кириллической буквы «Р». * Такое у меня происходило в методе @see Df_Autotrading_Model_Request_Locations::parseLocation() * Кто виноват: решение или исходный класс @see Zend_Filter_StringTrim — не знаю * (скорее, решение). * Поэтому мой класс @see \Df\Zf\Filter\StringTrim дополняет решение по ссылке выше * программным кодом из Zend Framework 2.0. */ /** @var \Df\Zf\Filter\StringTrim $filter */ $filter = new \Df\Zf\Filter\StringTrim($charlist); $result = $filter->filter($text); /** * @see Zend_Filter_StringTrim::filter() теоретически может вернуть null, * потому что этот метод зачастую перепоручает вычисление результата функции @uses preg_replace() * @url http://php.net/manual/function.preg-replace.php */ $result = df_nts($result); // Как ни странно, Zend_Filter_StringTrim иногда выдаёт результат « ». if (' ' === $result) { $result = ''; } } return $result; }
/** * @param string|null $key * @param mixed $value * @param string[]|bool $wrapInCData [optional] * @return X */ private function importString($key, $value, $wrapInCData = []) { /** @var bool $wrapInCDataAll */ $wrapInCDataAll = is_array($wrapInCData) ? false : !!$wrapInCData; $wrapInCData = df_nta($wrapInCData); /** * null означает, что метод importString * не должен создавать дочерний тэг $key, * а должен добавить текст * в качестве единственного содержимого текущего тэга */ if (!is_null($key)) { df_param_string($key, 0); } /** @var string $keyAsString */ $keyAsString = is_null($key) ? $this->getName() : $key; /** * @var bool $valueIsString */ $valueIsString = is_string($value); /** @var string $valueAsString */ $valueAsString = null; try { $valueAsString = $valueIsString ? $value : df_string($value); } catch (E $e) { df_error("Не могу сконвертировать значение ключа «%s» в строку.\n%s", $keyAsString, df_ets($e)); } /** @var bool $needWrapInCData */ $needWrapInCData = $wrapInCDataAll; if ($valueIsString && $valueAsString) { /** * Поддержка синтаксиса array( 'Представление' => df_cdata( $this->getAddress()->format( Mage_Customer_Model_Attribute_Data::OUTPUT_FORMAT_TEXT ) ) ) * Обратите внимание, что проверка на синтаксис[[]] должна предшествовать * проверке на принадлежность ключа $keyAsString в массиве $wrapInCData, * потому что при соответствии синтаксису[[]] нам надо удалить из значения символы[[]]. * Обратите внимание, что нам нужно выполнить проверку на синтаксис df_cdata ([[]]) * даже при $wrapInCDataAll = true, потому что маркеры [[ и ]] из данных надо удалять. */ /** * Перед вызовом медленной функции @see preg_match * выполняем более быструю и простую проверку @see df_contains */ if (df_contains($valueAsString, '[[') && df_contains($valueAsString, ']]')) { /** @var string $pattern */ $pattern = "#\\[\\[([\\s\\S]*)\\]\\]#mu"; /** @var string[] $matches */ $matches = []; if (1 === preg_match($pattern, $valueAsString, $matches)) { $valueAsString = $matches[1]; $needWrapInCData = true; } } $needWrapInCData = $needWrapInCData || in_array($keyAsString, $wrapInCData); } /** @var X $result */ $result = $needWrapInCData ? is_null($key) ? $this->setCData($valueAsString) : $this->addChildText($keyAsString, $valueAsString) : (is_null($key) ? $this->setValue($valueAsString) : $this->addChild($keyAsString, $valueAsString)); df_assert($result instanceof X); return $result; }
/** * 2015-08-14 * @param string $needle * @return bool */ function df_ruri_contains($needle) { return df_contains(df_ruri(), $needle); }
/** * @used-by df_exception_to_session() * @param string[] ...$args * @return string|string[] */ function df_xml_output_html(...$args) { return df_call_a(function ($text) { return !df_contains($text, DF_XML_BEGIN) ? $text : preg_replace_callback(sprintf('#%s([\\s\\S]*)%s#mui', DF_XML_BEGIN, DF_XML_END), function (array $matches) { return strtr('<pre class="df-xml">{contents}</div>', ['{contents}' => df_e(df_normalize(dfa($matches, 1, '')))]); }, $text); }, $args); }
/** * Пребразует строку вида «превед [[медвед]]» в «превед <a href="http://yandex.ru">медвед</a>». * @used-by Df_Admin_Model_Notifier::getMessage() * @used-by Df_Admin_Model_Notifier_Settings::getMessage() * @param string $text * @param string $url * @param string $quote [optional] * @return string */ function df_url_bake($text, $url, $quote = '"') { return !df_contains($text, '[[') ? $text : preg_replace("#\\[\\[([^\\]]+)\\]\\]#u", df_tag_a('$1', $url), $text); }
/** * 2015-08-24 * @param string $haystack * @param string $needle * @return bool */ function df_contains_ci($haystack, $needle) { return df_contains(mb_strtoupper($haystack), mb_strtoupper($needle)); }
/** * Возвращает неиспользуемое имя файла в заданной папке $directory по заданному шаблону $template. * Результатом всегда является непустая строка. * @param string $directory * @param string $template * @param string $ds [optional] * @return string */ function df_file_name($directory, $template, $ds = '-') { // 2016-11-09 // Отныне $template может содержать файловый путь: // в этом случае этот файловый путь убираем из $template и добавляем к $directory. $directory = df_path_n($directory); $template = df_path_n($template); if (df_contains($template, '/')) { /** @var string $templateA */ $templateA = explode('/', $template); $template = array_pop($templateA); $directory = df_cc_path($directory, $templateA); } /** @var string $result */ /** @var int $counter */ $counter = 1; /** @var bool $hasOrderingPosition */ $hasOrderingPosition = df_contains($template, '{ordering}'); /** @var \Zend_Date $now */ $now = \Zend_Date::now()->setTimezone('Europe/Moscow'); /** @var array(string => string) */ $vars = df_map_k(function ($k, $v) use($ds, $now) { return df_dts($now, implode($ds, $v)); }, ['date' => ['y', 'MM', 'dd'], 'time' => ['HH', 'mm'], 'time-full' => ['HH', 'mm', 'ss']]); /** * 2016-11-09 * @see \Zend_Date неправильно работает с миллисекундами: * всегда возвращает 0 вместо реального количества миллисекунд. * Так происходит из-за дефекта в методах * @see \Zend_Date::addMilliSecond() * @see \Zend_Date::setMilliSecond() * Там такой код: list($milli, $time) = explode(" ", microtime()); $milli = intval($milli); * https://github.com/OpenMage/magento-mirror/blob/1.9.3.0/lib/Zend/Date.php#L4490-L4491 * Этот код ошибочен, потому что после первой операции * $milli содержит дробное значение меньше 1, например: 0.653... * А вторая операция тупо делает из этого значения 0. */ $vars['time-full-ms'] = implode($ds, [$vars['time-full'], sprintf('%02d', round(100 * df_first(explode(' ', microtime()))))]); while (true) { /** @var string $fileName */ $fileName = df_var($template, ['ordering' => sprintf('%03d', $counter)] + $vars); /** @var string $fileFullPath */ $fileFullPath = $directory . DS . $fileName; if (!file_exists($fileFullPath)) { /** * Раньше здесь стояло file_put_contents, * и иногда почему-то возникал сбой: * failed to open stream: No such file or directory. * Может быть, такой сбой возникает, если папка не существует? */ $result = $fileFullPath; break; } else { if ($counter > 999) { df_error("Счётчик достиг предела ({$counter})."); } else { $counter++; /** * Если в шаблоне имени файла * нет переменной «{ordering}» — значит, надо добавить её, * чтобы в следующей интерации имя файла стало уникальным. * Вставляем «{ordering}» непосредственно перед расширением файла. * Например, rm.shipping.log преобразуем в rm.shipping-{ordering}.log */ if (!$hasOrderingPosition && 2 === $counter) { /** @var string[] $fileNameTemplateExploded */ $fileNameTemplateExploded = explode('.', $template); /** @var int $secondFromLastPartIndex*/ $secondFromLastPartIndex = max(0, count($fileNameTemplateExploded) - 2); /** @var string $secondFromLastPart */ $secondFromLastPart = dfa($fileNameTemplateExploded, $secondFromLastPartIndex); df_assert_string_not_empty($secondFromLastPart); $fileNameTemplateExploded[$secondFromLastPartIndex] = implode('--', [$secondFromLastPart, '{ordering}']); /** @var string $newFileNameTemplate */ $newFileNameTemplate = implode('.', $fileNameTemplateExploded); df_assert_ne($template, $newFileNameTemplate); $template = $newFileNameTemplate; } } } } return df_path_n($result); }
/** * 2016-10-15 * 2016-10-20 * Нельзя делать параметр $c опциональным, потому что иначе получим сбой: * «get_class() called without object from outside a class» * https://3v4l.org/k6Hd5 * * @param string|object $c * @return string */ function df_cld($c) { return df_contains(df_cts($c), '\\') ? '\\' : '_'; }