3

J'essaie d'utiliser le nouveau JavaScript Automation feature sous OS X (10.11) pour créer un script pour une application qui n'offre pas de dictionnaire. J'ai un AppleScript qui interagit avec cette application à l'aide AppleEvents premières, comme ceci:Envoyer et recevoir des événements Apple "crus" de JavaScript sur OS X (El Capitan)

tell application "Bookends" 
    return «event ToySSQLS» "authors REGEX 'Johnson' " 
end tell 

Maintenant, ma question est la suivante: comment puis-je traduis cela JavaScript? Je ne trouve aucune information sur l'API Javascript OSA pour envoyer et recevoir des événements Apple bruts.

Une solution de contournement possible pourrait être à call a piece of AppleScript through the shell, mais je préférerais travailler avec une API "réelle".

Répondre

1

Vous pouvez au moins faire quelque chose plus rapide qu'un appel de script shell en utilisant OSAKit dans quelques fonctions d'aide:

// evalOSA :: String -> String -> IO String 
function evalOSA(strLang, strCode) { 

    var oScript = ($.OSAScript || (
      ObjC.import('OSAKit'), 
      $.OSAScript)) 
     .alloc.initWithSourceLanguage(
      strCode, $.OSALanguage.languageForName(strLang) 
     ), 
     error = $(), 
     blnCompiled = oScript.compileAndReturnError(error), 
     oDesc = blnCompiled ? (
      oScript.executeAndReturnError(error) 
     ) : undefined; 

    return oDesc ? (
     oDesc.stringValue.js 
    ) : error.js.NSLocalizedDescription.js; 
} 

// eventCode :: String -> String 
function eventCode(strCode) { 
    return 'tell application "Bookends" to «event ToyS' + 
     strCode + '»'; 
} 

qui vous permettent ensuite d'écrire des fonctions telles que:

// sqlMatchIDs :: String -> [String] 
function sqlMatchIDs(strClause) { 
    // SELECT clause without the leading SELECT keyword 
    var strResult = evalOSA(
     '', eventCode('SQLS') + 
     ' "' + strClause + '"' 
    ); 

    return strResult.indexOf('\r') !== -1 ? (
     strResult.split('\r') 
    ) : (strResult ? [strResult] : []); 
} 

et appelle comme

sqlMatchIDs("authors like '%Harrington%'") 

Ensemble complet d'exemples ici: JavaScript wrappers for Bookends functions