Using Javascript to modify text

UPDATE: I know KM has a built-in clipboard feature for Title Case. This is more of a proof of concept so I know how to use Javascript scripts in macros.

I’d like to create a macro that uses the following script to convert selected text to titlecase. I’ve created similar scripts that use Applescript, but I’m unsure how to handle getting the clipboard contents in, processed and back out using Javascript!

With Applescript I use something like:

set the ClipURL to (the clipboard as string)

tell application "Keyboard Maestro Engine"
	set LongURL to process tokens ("%Variable%LongURL%")
	set ShortURLKeyword to process tokens ("%Variable%ShortURLKeyword%")
end tell

How do I do the same kind of thing with Javascript?

Chris, try this:

/*
⩶⩶⩶⩶⩶⩶⩶⩶⩶⩶⩶⩶⩶⩶⩶⩶⩶⩶⩶⩶⩶⩶⩶⩶⩶⩶⩶⩶⩶⩶
	[STRINGS] Transform String to Title Case [JXA]
⩶⩶⩶⩶⩶⩶⩶⩶⩶⩶⩶⩶⩶⩶⩶⩶⩶⩶⩶⩶⩶⩶⩶⩶⩶⩶⩶⩶⩶⩶

DATE:    Wed, Feb 10, 2016
AUTHOR:  JMichaelTX (in most forums)
           Find any bugs/issues or have suggestions for improvement?
           Contact me via PM or at blog.jmichaeltx.com/contact/
REF:  https://github.com/gouch/to-title-case/blob/master/to-title-case.js    
⩶⩶⩶⩶⩶⩶⩶⩶⩶⩶⩶⩶⩶⩶⩶⩶⩶⩶⩶⩶⩶⩶⩶⩶⩶⩶⩶⩶⩶⩶
*/
var app = Application.currentApplication();
app.includeStandardAdditions = true;


//~~~~~ PROTOTYPE DEFINITOINS ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

// REF:   https://github.com/gouch/to-title-case/blob/master/to-title-case.js

String.prototype.toTitleCase = function(){
  var smallWords = /^(a|an|and|as|at|but|by|en|for|if|in|nor|of|on|or|per|the|to|vs?\.?|via)$/i;

  return this.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);
  });
};
//~~~~~~~~~~~~~~~~ END OF PROTOTYPE DEFINITIONS ~~~~~~~~~~~~~~~~~~~~~~


//--- NOTE THAT USE OF THE PROTOTYPE toTitleCase() MUST BE AFTER ABOVE DEFINITION ---

var titleCaseStr = app.theClipboard().toTitleCase()
app.setTheClipboardTo(titleCaseStr)

titleCaseStr		// Only needed if you want the script to return results to KM

Chris,

You may also find these JXA functions useful:
Get & Set Functions for KM Variables JXA.js