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);
 | |
|     }
 | |
| }
 |