- <?php
-
- /**
- * This file is part of cocur/slugify.
- *
- * (c) Florian Eckerstorfer <[email protected]>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
- namespace Cocur\Slugify;
-
- use Cocur\Slugify\RuleProvider\DefaultRuleProvider;
- use Cocur\Slugify\RuleProvider\RuleProviderInterface;
-
- /**
- * Slugify
- *
- * @package Cocur\Slugify
- * @author Florian Eckerstorfer <[email protected]>
- * @author Ivo Bathke <[email protected]>
- * @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,
- '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
- 'azerbaijani',
- 'burmese',
- 'hindi',
- 'georgian',
- 'norwegian',
- 'vietnamese',
- 'ukrainian',
- 'latvian',
- 'finnish',
- 'greek',
- 'czech',
- 'arabic',
- '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']) {
- $string = mb_strtolower($string);
- }
-
- $string = preg_replace($options['regexp'], $options['separator'], $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);
- }
- }
This file has been truncated. show original