200 lines
		
	
	
		
			5.3 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			200 lines
		
	
	
		
			5.3 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
<?php
 | 
						|
 | 
						|
/**
 | 
						|
 * This file is part of cocur/slugify.
 | 
						|
 *
 | 
						|
 * (c) Florian Eckerstorfer <florian@eckerstorfer.co>
 | 
						|
 *
 | 
						|
 * For the full copyright and license information, please view the LICENSE
 | 
						|
 * file that was distributed with this source code.
 | 
						|
 *
 | 
						|
 * CHANGED by nK:
 | 
						|
 *   - added check for `mb_strtolower` existence and use `strtolower` if mb is not available
 | 
						|
 */
 | 
						|
 | 
						|
namespace Cocur\Slugify;
 | 
						|
 | 
						|
use Cocur\Slugify\RuleProvider\DefaultRuleProvider;
 | 
						|
use Cocur\Slugify\RuleProvider\RuleProviderInterface;
 | 
						|
 | 
						|
/**
 | 
						|
 * Slugify
 | 
						|
 *
 | 
						|
 * @package   Cocur\Slugify
 | 
						|
 * @author    Florian Eckerstorfer <florian@eckerstorfer.co>
 | 
						|
 * @author    Ivo Bathke <ivo.bathke@gmail.com>
 | 
						|
 * @author    Marchenko Alexandr
 | 
						|
 * @copyright 2012-2015 Florian Eckerstorfer
 | 
						|
 * @license   http://www.opensource.org/licenses/MIT The MIT License
 | 
						|
 */
 | 
						|
class Slugify implements SlugifyInterface
 | 
						|
{
 | 
						|
    const LOWERCASE_NUMBERS_DASHES = '/[^A-Za-z0-9]+/';
 | 
						|
 | 
						|
    /**
 | 
						|
     * @var array<string,string>
 | 
						|
     */
 | 
						|
    protected $rules = [];
 | 
						|
 | 
						|
    /**
 | 
						|
     * @var RuleProviderInterface
 | 
						|
     */
 | 
						|
    protected $provider;
 | 
						|
 | 
						|
    /**
 | 
						|
     * @var array<string,mixed>
 | 
						|
     */
 | 
						|
    protected $options = [
 | 
						|
        'regexp'    => self::LOWERCASE_NUMBERS_DASHES,
 | 
						|
        'separator' => '-',
 | 
						|
        'lowercase' => true,
 | 
						|
        'lowercase_after_regexp' => false,
 | 
						|
        'trim' => true,
 | 
						|
        'strip_tags' => false,
 | 
						|
        'rulesets'  => [
 | 
						|
            'default',
 | 
						|
            // Languages are preferred if they appear later, list is ordered by number of
 | 
						|
            // websites in that language
 | 
						|
            // https://en.wikipedia.org/wiki/Languages_used_on_the_Internet#Content_languages_for_websites
 | 
						|
            'armenian',
 | 
						|
            'azerbaijani',
 | 
						|
            'burmese',
 | 
						|
            'hindi',
 | 
						|
            'georgian',
 | 
						|
            'norwegian',
 | 
						|
            'vietnamese',
 | 
						|
            'ukrainian',
 | 
						|
            'latvian',
 | 
						|
            'finnish',
 | 
						|
            'greek',
 | 
						|
            'czech',
 | 
						|
            'arabic',
 | 
						|
            'slovak',
 | 
						|
            'turkish',
 | 
						|
            'polish',
 | 
						|
            'german',
 | 
						|
            'russian',
 | 
						|
            'romanian'
 | 
						|
        ],
 | 
						|
    ];
 | 
						|
 | 
						|
    /**
 | 
						|
     * @param array                 $options
 | 
						|
     * @param RuleProviderInterface $provider
 | 
						|
     */
 | 
						|
    public function __construct(array $options = [], RuleProviderInterface $provider = null)
 | 
						|
    {
 | 
						|
        $this->options  = array_merge($this->options, $options);
 | 
						|
        $this->provider = $provider ? $provider : new DefaultRuleProvider();
 | 
						|
 | 
						|
        foreach ($this->options['rulesets'] as $ruleSet) {
 | 
						|
            $this->activateRuleSet($ruleSet);
 | 
						|
        }
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Returns the slug-version of the string.
 | 
						|
     *
 | 
						|
     * @param string            $string  String to slugify
 | 
						|
     * @param string|array|null $options Options
 | 
						|
     *
 | 
						|
     * @return string Slugified version of the string
 | 
						|
     */
 | 
						|
    public function slugify($string, $options = null)
 | 
						|
    {
 | 
						|
        // BC: the second argument used to be the separator
 | 
						|
        if (is_string($options)) {
 | 
						|
            $separator            = $options;
 | 
						|
            $options              = [];
 | 
						|
            $options['separator'] = $separator;
 | 
						|
        }
 | 
						|
 | 
						|
        $options = array_merge($this->options, (array) $options);
 | 
						|
 | 
						|
        // Add a custom ruleset without touching the default rules
 | 
						|
        if (isset($options['ruleset'])) {
 | 
						|
            $rules = array_merge($this->rules, $this->provider->getRules($options['ruleset']));
 | 
						|
        } else {
 | 
						|
            $rules = $this->rules;
 | 
						|
        }
 | 
						|
 | 
						|
        $string = ($options['strip_tags'])
 | 
						|
            ? strip_tags($string)
 | 
						|
            : $string;
 | 
						|
 | 
						|
        $string = strtr($string, $rules);
 | 
						|
        unset($rules);
 | 
						|
 | 
						|
        if ($options['lowercase'] && !$options['lowercase_after_regexp']) {
 | 
						|
            // CHANGED: nK
 | 
						|
            // added check for mb_strtolower existence.
 | 
						|
            $string = function_exists('mb_strtolower') ? mb_strtolower($string) : strtolower($string);
 | 
						|
        }
 | 
						|
 | 
						|
        $string = preg_replace($options['regexp'], $options['separator'], $string);
 | 
						|
 | 
						|
        if ($options['lowercase'] && $options['lowercase_after_regexp']) {
 | 
						|
            // CHANGED: nK
 | 
						|
            // added check for mb_strtolower existence.
 | 
						|
            $string = function_exists('mb_strtolower') ? mb_strtolower($string) : strtolower($string);
 | 
						|
        }
 | 
						|
 | 
						|
        return ($options['trim'])
 | 
						|
            ? trim($string, $options['separator'])
 | 
						|
            : $string;
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Adds a custom rule to Slugify.
 | 
						|
     *
 | 
						|
     * @param string $character   Character
 | 
						|
     * @param string $replacement Replacement character
 | 
						|
     *
 | 
						|
     * @return Slugify
 | 
						|
     */
 | 
						|
    public function addRule($character, $replacement)
 | 
						|
    {
 | 
						|
        $this->rules[$character] = $replacement;
 | 
						|
 | 
						|
        return $this;
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Adds multiple rules to Slugify.
 | 
						|
     *
 | 
						|
     * @param array <string,string> $rules
 | 
						|
     *
 | 
						|
     * @return Slugify
 | 
						|
     */
 | 
						|
    public function addRules(array $rules)
 | 
						|
    {
 | 
						|
        foreach ($rules as $character => $replacement) {
 | 
						|
            $this->addRule($character, $replacement);
 | 
						|
        }
 | 
						|
 | 
						|
        return $this;
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * @param string $ruleSet
 | 
						|
     *
 | 
						|
     * @return Slugify
 | 
						|
     */
 | 
						|
    public function activateRuleSet($ruleSet)
 | 
						|
    {
 | 
						|
        return $this->addRules($this->provider->getRules($ruleSet));
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Static method to create new instance of {@see Slugify}.
 | 
						|
     *
 | 
						|
     * @param array <string,mixed> $options
 | 
						|
     *
 | 
						|
     * @return Slugify
 | 
						|
     */
 | 
						|
    public static function create(array $options = [])
 | 
						|
    {
 | 
						|
        return new static($options);
 | 
						|
    }
 | 
						|
}
 |