Skip to content

Instantly share code, notes, and snippets.

@jeffjohnson9046
Created March 26, 2014 18:22
Show Gist options
  • Select an option

  • Save jeffjohnson9046/9789876 to your computer and use it in GitHub Desktop.

Select an option

Save jeffjohnson9046/9789876 to your computer and use it in GitHub Desktop.
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

dwavid commented Nov 14, 2015

Copy link
Copy Markdown

Thank you! This is awesome

@estevanio

Copy link
Copy Markdown

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

@oaguy1

oaguy1 commented Dec 5, 2015

Copy link
Copy Markdown

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

Copy link
Copy Markdown

@oaguy1 +1 for the CoffeeScript version

@nburroni

nburroni commented Jul 21, 2016

Copy link
Copy Markdown

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

Copy link
Copy Markdown

Fantastic!

I love Google and Angular...

@superkaleider

Copy link
Copy Markdown

spot on dude, this is awesome! Thanks

@johnculviner

johnculviner commented Jan 10, 2017

Copy link
Copy Markdown

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

@vishnuys

Copy link
Copy Markdown

Thank you very much.

@zurtri

zurtri commented Sep 11, 2017

Copy link
Copy Markdown

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

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

@rossmeyerza

Copy link
Copy Markdown

Works like a charm.

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