Вход Регистрация
Файл: vendor/symfony/console/Helper/OutputWrapper.php
Строк: 92
<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace SymfonyComponentConsoleHelper;

/**
 * Simple output wrapper for "tagged outputs" instead of wordwrap(). This solution is based on a StackOverflow
 * answer: https://stackoverflow.com/a/20434776/1476819 from user557597 (alias SLN).
 *
 *  (?:
 *       # -- Words/Characters
 *       (                       # (1 start)
 *            (?>                     # Atomic Group - Match words with valid breaks
 *                 .{1,16}                 #  1-N characters
 *                                         #  Followed by one of 4 prioritized, non-linebreak whitespace
 *                 (?:                     #  break types:
 *                      (?<= [^Srn] )        # 1. - Behind a non-linebreak whitespace
 *                      [^Srn]?              #      ( optionally accept an extra non-linebreak whitespace )
 *                   |  (?= r? n )            # 2. - Ahead a linebreak
 *                   |  $                       # 3. - EOS
 *                   |  [^Srn]               # 4. - Accept an extra non-linebreak whitespace
 *                 )
 *            )                       # End atomic group
 *         |
 *            .{1,16}                 # No valid word breaks, just break on the N'th character
 *       )                       # (1 end)
 *       (?: r? n )?           # Optional linebreak after Words/Characters
 *    |
 *       # -- Or, Linebreak
 *       (?: r? n | $ )        # Stand alone linebreak or at EOS
 *  )
 *
 * @author Krisztián Ferenczi <ferenczi.krisztian@gmail.com>
 *
 * @see https://stackoverflow.com/a/20434776/1476819
 */
final class OutputWrapper
{
    private const 
TAG_OPEN_REGEX_SEGMENT '[a-z](?:[^\\<>]*+ | \\.)*';
    private const 
TAG_CLOSE_REGEX_SEGMENT '[a-z][^<>]*+';
    private const 
URL_PATTERN 'https?://S+';

    public function 
__construct(
        private 
bool $allowCutUrls false
    
) {
    }

    public function 
wrap(string $textint $widthstring $break "n"): string
    
{
        if (!
$width) {
            return 
$text;
        }

        
$tagPattern sprintf('<(?:(?:%s)|/(?:%s)?)>'self::TAG_OPEN_REGEX_SEGMENTself::TAG_CLOSE_REGEX_SEGMENT);
        
$limitPattern "{1,$width}";
        
$patternBlocks = [$tagPattern];
        if (!
$this->allowCutUrls) {
            
$patternBlocks[] = self::URL_PATTERN;
        }
        
$patternBlocks[] = '.';
        
$blocks implode('|'$patternBlocks);
        
$rowPattern "(?:$blocks)$limitPattern";
        
$pattern sprintf('#(?:((?>(%1$s)((?<=[^Srn])[^Srn]?|(?=r?n)|$|[^Srn]))|(%1$s))(?:r?n)?|(?:r?n|$))#imux'$rowPattern);
        
$output rtrim(preg_replace($pattern'\1'.$break$text), $break);

        return 
str_replace(' '.$break$break$output);
    }
}
Онлайн: 1
Реклама