Skip to content

Instantly share code, notes, and snippets.

@boboldehampsink
Last active May 16, 2016 12:56
Show Gist options
  • Star 8 You must be signed in to star a gist
  • Fork 2 You must be signed in to fork a gist
  • Save boboldehampsink/7354431 to your computer and use it in GitHub Desktop.
Save boboldehampsink/7354431 to your computer and use it in GitHub Desktop.
Slugify Twig Extension - Use like this: {{ user.fullName | slugify }}. Uses Craft's core slug technology.
<?php
namespace Craft;
class SlugifyPlugin extends BasePlugin
{
public function getName()
{
return Craft::t('Slugify Twig Extension');
}
public function getVersion()
{
return '1.0';
}
public function getDeveloper()
{
return 'Bob Olde Hampsink';
}
public function getDeveloperUrl()
{
return 'http://www.itmundi.nl';
}
public function hookAddTwigExtension()
{
Craft::import('plugins.slugify.twigextensions.SlugifyTwigExtension');
return new SlugifyTwigExtension();
}
}
<?php
namespace Craft;
class SlugifyTwigExtension extends \Twig_Extension
{
protected $env;
public function getName()
{
return 'Slugify Twig Extension';
}
public function getFilters()
{
return array('slugify' => new \Twig_Filter_Method($this, 'slugify'));
}
public function getFunctions()
{
return array('slugify' => new \Twig_Function_Method($this, 'slugify'));
}
public function initRuntime(\Twig_Environment $env)
{
$this->env = $env;
}
public function slugify($slug)
{
// Remove HTML tags
$slug = preg_replace('/<(.*?)>/u', '', $slug);
// Remove inner-word punctuation.
$slug = preg_replace('/[\'"‘’“”]/u', '', $slug);
// Make it lowercase
$slug = mb_strtolower($slug, 'UTF-8');
// Get the "words". Split on anything that is not a unicode letter or number.
// Periods are OK too.
preg_match_all('/[\p{L}\p{N}\.]+/u', $slug, $words);
$words = ArrayHelper::filterEmptyStringsFromArray($words[0]);
$slug = implode('-', $words);
return $slug;
}
}
@boboldehampsink
Copy link
Author

Here's the repo maintained by me: https://github.com/boboldehampsink/slugify

@joshangell
Copy link

Yay thanks @boboldehampsink!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment