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
Copy link
Copy Markdown

dwavid commented Nov 14, 2015

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
Copy link
Copy Markdown

oaguy1 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
Copy link
Copy Markdown

@oaguy1 +1 for the CoffeeScript version

@nburroni
Copy link
Copy Markdown

nburroni 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
Copy link
Copy Markdown

Fantastic!

I love Google and Angular...

@superkaleider
Copy link
Copy Markdown

spot on dude, this is awesome! Thanks

@johnculviner
Copy link
Copy Markdown

johnculviner commented Jan 10, 2017

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

@vishnuys
Copy link
Copy Markdown

Thank you very much.

@zurtri
Copy link
Copy Markdown

zurtri commented Sep 11, 2017

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