Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
A title-case filter for AngularJs
// Came from the comments here: https://gist.github.com/maruf-nc/5625869
app.filter('titlecase', function() {
return function (input) {
var smallWords = /^(a|an|and|as|at|but|by|en|for|if|in|nor|of|on|or|per|the|to|vs?\.?|via)$/i;
input = input.toLowerCase();
return input.replace(/[A-Za-z0-9\u00C0-\u00FF]+[^\s-]*/g, function(match, index, title) {
if (index > 0 && index + match.length !== title.length &&
match.search(smallWords) > -1 && title.charAt(index - 2) !== ":" &&
(title.charAt(index + match.length) !== '-' || title.charAt(index - 1) === '-') &&
title.charAt(index - 1).search(/[^\s-]/) < 0) {
return match.toLowerCase();
}
if (match.substr(1).search(/[A-Z]|\../) > -1) {
return match;
}
return match.charAt(0).toUpperCase() + match.substr(1);
});
}
});
@dwavid

This comment has been minimized.

Copy link

commented Nov 14, 2015

Thank you! This is awesome

@stavinopolis

This comment has been minimized.

Copy link

commented Nov 20, 2015

Took all of 5 seconds to get to using this in my app. Thanks!

@oaguy1

This comment has been minimized.

Copy link

commented Dec 5, 2015

Coffeescript version for those interested

.filter('titlecase', () ->
  return (input) ->
    smallWords = /^(a|an|and|as|at|but|by|en|for|if|in|nor|of|on|or|per|the|to|vs?\.?|via)$/i
    input = input.toLowerCase()
    return input.replace(/[A-Za-z0-9\u00C0-\u00FF]+[^\s-]*/g, (match, index, title) ->
      if (index > 0 && index + match.length != title.length && match.search(smallWords) > -1 && title.charAt(index - 2) != ":" && (title.charAt(index + match.length) != '-' || title.charAt(index - 1    ) == '-') && title.charAt(index - 1).search(/[^\s-]/) < 0)
        return match.toLowerCase()
        if (match.substr(1).search(/[A-Z]|\../) > -1)
          return match
          return match.charAt(0).toUpperCase() + match.substr(1)
    )
)
@ardeearam

This comment has been minimized.

Copy link

commented Jan 27, 2016

@oaguy1 +1 for the CoffeeScript version

@nburroni

This comment has been minimized.

Copy link

commented Jul 21, 2016

That coffeescript snippet above has some wrong indentations. Here it is corrected (I already tried it and it works).

.filter('titlecase', () ->
  return (input) ->
    smallWords = /^(a|an|and|as|at|but|by|con|de|en|for|if|in|la|las|nor|of|on|or|per|the|to|vs?\.?|via)$/i
    return if not input
    input = input.toLowerCase()
    return input.replace(/[A-Za-z0-9\u00C0-\u00FF]+[^\s-]*/g, (match, index, title) ->
      return match.toLowerCase() if (index > 0 && index + match.length != title.length &&
          match.search(smallWords) > -1 && title.charAt(index - 2) != ":" &&
          (title.charAt(index + match.length) != '-' || title.charAt(index - 1    ) == '-') &&
          title.charAt(index - 1).search(/[^\s-]/) < 0)
      return match if (match.substr(1).search(/[A-Z]|\../) > -1)
      return match.charAt(0).toUpperCase() + match.substr(1)
    )
)

Hope it helps!

@greywire

This comment has been minimized.

Copy link

commented Aug 30, 2016

Fantastic!

I love Google and Angular...

@superkaleider

This comment has been minimized.

Copy link

commented Nov 10, 2016

spot on dude, this is awesome! Thanks

@johnculviner

This comment has been minimized.

Copy link

commented Jan 10, 2017

^^😄 problem with coffescript right there (didn't know anyone used it anymore TBH)

@vishnuys

This comment has been minimized.

Copy link

commented Aug 10, 2017

Thank you very much.

@zurtri

This comment has been minimized.

Copy link

commented Sep 11, 2017

May I suggest adding a check for if input is undefined?

if(input === undefined){ return null; }

@rossmeyerza

This comment has been minimized.

Copy link

commented Nov 3, 2017

Works like a charm.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.