Example #1
0
 /** @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";
     });
 }
Example #2
0
 /**
  * @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()}».");
     }
 }
Example #3
0
 /**
  * 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;
 }
Example #4
0
 /**
  * @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;
 }
Example #5
0
File: X.php Project: mage2pro/core
 /**
  * @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;
 }
Example #6
0
/**
 * 2015-08-14
 * @param string $needle
 * @return bool
 */
function df_ruri_contains($needle)
{
    return df_contains(df_ruri(), $needle);
}
Example #7
0
/**
 * @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);
}
Example #8
0
/**
 * Пребразует строку вида «превед [[медвед]]» в «превед <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);
}
Example #9
0
/**
 * 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));
}
Example #10
0
/**
 * Возвращает неиспользуемое имя файла в заданной папке $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);
}
Example #11
0
/**
 * 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), '\\') ? '\\' : '_';
}