Converting Drafts Text to Title Case

Oct 14, 2016
Joe Buhlig
~3 mins

Drafts is easily one of the most used apps on my phone. To me, it is the pinnacle of resistance-free digital capture. If I look through my list of processed drafts, the most common forms of text I capture are content ideas and book suggestions. This tells me I read, write, and record a lot.

I like my placeholders for these new ideas to be uniform. In this case that means each content idea - whether it’s a blog post idea or a new video - is captured as the title I would use for the content itself.

But let’s be serious, I hate hitting the shift key at the beginning of every new word and I’m terrible at remembering which words should be capitalized and which should remain lowercase.

Knowing the power of Drafts, I asked if it were possible for my capture tool to handle this for me. That question led me to an article about title case and JavaScript by the always excellent Dr. Drang.

Using his script as a base, this is what I landed on:

var small = "(a|an|and|as|at|but|by|en|for|if|in|of|on|or|the|to|v[.]?|via|vs[.]?)";
    var punct = "([!\"#$%&'()*+,./:;<=>?@[\\\\\\]^_`{|}~-]*)";
  
    this.titleCaps = function(title){
        var parts = [], split = /[:.;?!] |(?: |^)[]/g, index = 0;
        
        while (true) {
            var m = split.exec(title);

            parts.push( title.substring(index, m ? m.index : title.length)
                .replace(/\b([A-Za-z][a-z.'Õ]*)\b/g, function(all){
                    return /[A-Za-z]\.[A-Za-z]/.test(all) ? all : upper(all);
                })
                .replace(RegExp("\\b" + small + "\\b", "ig"), lower)
                .replace(RegExp("^" + punct + small + "\\b", "ig"), function(all, punct, word){
                    return punct + upper(word);
                })
                .replace(RegExp("\\b" + small + punct + "$", "ig"), upper));
            
            index = split.lastIndex;
            
            if ( m ) parts.push( m[0] );
            else break;
        }
        
        return parts.join("").replace(/ V(s?)\. /ig, " v$1. ")
            .replace(/([])S\b/ig, "$1s")
            .replace(/\b(AT&T|Q&A)\b/ig, function(all){
                return all.toUpperCase();
            });
    };
    
    function lower(word){
        return word.toLowerCase();
    }
    
    function upper(word){
      return word.substr(0,1).toUpperCase() + word.substr(1);
    }

draft.content = titleCaps(draft.content);
commit(draft);

To install it, click here.

From a practical standpoint, I set this up as an action key so I can use it easily. Now, all I do is type the idea, hit TI above the keyboard, and then action it off to where belongs.