Last active
May 16, 2016 12:56
-
-
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.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?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(); | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?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; | |
} | |
} |
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.
someone already created the repo - and I have a pullrequest pending with Lindseys suggested change
Here's the repo maintained by me: https://github.com/boboldehampsink/slugify
Yay thanks @boboldehampsink!
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
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?