Generate and validate slugs - i.e. unique, SEO-friendly URL segments.
See e.g. https://en.wikipedia.org/wiki/Semantic_URL#Slug

/sprout/Controllers/Admin/PageAdminController.php Highlighted file source
Line 60: use Sprout\Helpers\Slug;
Line 306: // HACK: we should attempt to generate a unique slug rather than just failing out
Line 312: Slug::unique(Enc::urlname((string)@$_POST['name'], '-'), 'pages', $conds);
Line 352: $update_fields['slug'] = Enc::urlname($_POST['name'], '-');
Line 793: $update_fields['slug'] = Enc::urlname(trim($node['name']), '-');
Line 914: // If no slug set, create one
Line 915: if (empty($page['slug'])) $page['slug'] = Enc::urlname($page['name']);
Line 1027: AdminSeo::setSlug($data['slug']);
Line 1432: 'slug' => 'URL slug',
Line 1436: $valid->required(['name', 'slug']);
Line 1438: $valid->check('slug', 'Validity::length', 1, 200);
Line 1439: $valid->check('slug', 'Slug::valid');
Line 1441: $slug_conditions = [
Line 1446: $valid->check('slug', 'Slug::unique', 'pages', $slug_conditions);
Line 1526: $update_fields['slug'] = Enc::urlname($_POST['slug'], '-');

/sprout/Helpers/AdminSeo.php Highlighted file source
Line 38: public static $slug = '';
Line 84: * Set page slug for analysis
Line 89: public static function setSlug($str)
Line 92: self::$slug = $str;
Line 278: self::determineSlugWordsScore();
Line 393: * Determine SEO slug stopwords score
Line 397: public static function determineSlugWordsScore()
Line 399: if (empty(self::$slug)) return;
Line 404: $slug_words = preg_split('~[\W_]+~', self::$slug);
Line 406: foreach ($slug_words as $slug_word) {
Line 407: if (self::isStopWord($slug_word)) $stopword = true;
Line 408: if (in_array($slug_word, array_keys($kwords))) $keyword = true;
Line 412: self::$seo_improvements[] = 'Keywords do not appear in your URL slug.';
Line 416: self::$seo_considerations[] = 'The URL slug contains <a href="https://en.wikipedia.org/wiki/Stop_words" target="_blank">stop words</a>. This may or may not be wise depending on the circumstances.';
Line 419: // Topic in slug
Line 420: if (empty(self::$topic) or empty($slug_words)) return;
Line 426: if (in_array($topic_word, $slug_words)) $topic = true;
Line 430: self::$seo_goodresults[] = sprintf('Topic "%s" appears in the URL slug.', self::$topic);
Line 432: self::$seo_improvements[] = sprintf('Topic "%s" doesn\'t appear in the URL slug.', self::$topic);

/sprout/Helpers/Slug.php Highlighted file source
Line 21: * Generate and validate slugs - i.e. unique, SEO-friendly URL segments.
Line 22: * See e.g. https://en.wikipedia.org/wiki/Semantic_URL#Slug
Line 24: class Slug
Line 28: * Create a slug, and ensure it's unique
Line 32: * @return string The generated slug, should always be unique
Line 44: // No existing record found with that slug, so it's available
Line 55: * The row is specified using its slug.
Line 58: * @param string $slug The slug of the record to fetch
Line 64: public static function get($table, $slug, array $conditions = [])
Line 68: $params = [$slug];
Line 69: $q = "SELECT * FROM ~{$table} WHERE slug = ?";
Line 78: * Verify that a slug contains only valid characters
Line 81: * $valid->check('slug', 'Slug::valid');
Line 83: * @param string $value The slug
Line 89: throw new ValidationException('contains invalid characters. Slugs may only contain a to z (lower-case), 0 to 9 and hyphens (-)');
Line 94: * Verify that a slug is unique for a given table
Line 98: * $valid->check('slug', 'Slug::unique', 'pages', [['id', '!=', $page_id]]);
Line 100: * @param string $value The slug
Line 101: * @param string $table The table to check, which must contain columns 'id', 'name', and 'slug'
Line 104: * @throws ValidationException If the slug isn't unique in the table under the specified conditions
Line 111: $conditions['slug'] = $value;
Line 119: $err = 'The slug "' . $value . '" is already in use';

/sprout/tests/SlugTest.php Highlighted file source
Line 3: use Sprout\Helpers\Slug;
Line 6: class SlugTest extends PHPUnit_Framework_TestCase
Line 18: ['slug-09-test'],
Line 32: Slug::valid($value);
Line 35: $this->assertEquals($value, 'Slug is valid but failed the validation test');
Line 50: ['slug_slug'],
Line 93: Slug::valid($value);
A total of 76 lines in 9 files were found