Skip to content

Instantly share code, notes, and snippets.

@boboldehampsink
Last active May 16, 2016 12:56
  • Star 8 You must be signed in to star a gist
  • Fork 2 You must be signed in to fork a gist
Star You must be signed in to star a gist
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;
}
}
@joshangell
Copy link

Bob I'm with Lindsey on this one - I'd be happy to pull it into a repo if you don't want to maintain it?

@lindseydiloreto
Copy link

Hey Bob, it would be super sweet if this were a normal plugin repo... Then I could submit this pull request:

public function slugify($slug)
{
    return ElementHelper::createSlug($slug);
}

It ties the plugin to the native core logic. The slugifying logic recently changed slightly, and could evolve again in the future.

@maxxst
Copy link

maxxst commented Sep 19, 2014

someone already created the repo - and I have a pullrequest pending with Lindseys suggested change

https://github.com/nodepub/CraftSlugifyPlugin

@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