L'Isola di Niente
L'Isola di Niente » JavaScript Tips » JXA 覚書

JXA 覚書

# 最終更新日 2017.02.26

ココでは JXA 特有のものを。

JavaScript 文字列と NSString の変換
ObjC.import("Cocoa");

// JavaScript 文字列から NSString
// ObjC.wrap("日本語") でもいい
let nsStr = $("日本語");
$.NSLog("%@", nsStr);

// NSString から JavaScript 文字列は js メソッド
// ObjC.unwrap(nsstr) でもい
let jsStr = nsStr.js;
console.log(jsStr);

// UTF-8 文字列の NSData に変換
let nsData = $("日本語も OK").dataUsingEncoding($.NSUTF8StringEncoding)

// UTF-8 文字列の NSData から NSString に
let nsStr2 = $.NSString.alloc.initWithDataEncoding(nsData, $.NSUTF8StringEncoding);

// NSString を C 言語文字列(配列)に
let cStr = nsStr2.UTF8String;

// C 言語文字列(配列)を NSString に
let nsStr3 = $.NSString.alloc.initWithCStringEncoding(cStr, $.NSUTF8StringEncoding);

stdin, stdout
ObjC.import('Cocoa')

// prompt
let fho = $.NSFileHandle.fileHandleWithStandardOutput;
let prp = $("何か入力してください :").dataUsingEncoding($.NSUTF8StringEncoding)
fho.writeData(prp);

// Objc stdin
let fhi = $.NSFileHandle.fileHandleWithStandardInput;
let data = fhi.availableData;
let nsStr = $.NSString.alloc.initWithDataEncoding(data, $.NSUTF8StringEncoding);
console.log(nsStr.js.slice(0, -1) + " が入力されました")

// ObjC stdout
let jsStr = "ja-JP.UTF-8 日本語\n";
let utf8Data = $(jsStr).dataUsingEncoding($.NSUTF8StringEncoding);
fho.writeData(utf8Data);

// C stdout
ObjC.import("stdio")
let res = $.printf($("%s もコレでイケる\n").UTF8String, $(jsStr).UTF8String);

パス名色々
ObjC.import("Cocoa");

const pathA = $("~/Documents/日本語.txt");
// ~ を $HOME へ展開
let pathB = pathA.stringByExpandingTildeInPath;
console.log("Path @ " + pathB.js);
//=> Path @ /Users/sasakima-nao/Documents/日本語.txt

// フルパスを URI に変換
let uri = $.NSURL.fileURLWithPath(pathB);
console.log("URI @ " + uri.absoluteString.js);
//=>URI @ file:///Users/sasakima-nao/Documents/%E6%97%A5%E6%9C%AC%E8%AA%9E.txt

// URI をフルパスに戻す
let pathC = uri.path;
console.log("Path @ " + pathC.js);
//=> Path @ /Users/sasakima-nao/Documents/日本語.txt

// パス名色々
console.log(pathC.stringByDeletingLastPathComponent.js);
//=> /Users/sasakima-nao/Documents
console.log(pathC.lastPathComponent.js);
//=> 日本語.txt
console.log(pathC.pathExtension.js);
//=> txt
console.log(pathC.stringByDeletingPathExtension.js);
//=> /Users/sasakima-nao/Documents/日本語
文字列色々
ObjC.import("Cocoa");

// connect
let nsStr = $("合体").stringByAppendingString($("します"));
console.log(nsStr.js);

// format: NSString
nsStr = $.NSString.stringWithFormat($("%@ %@"), $("フォーマット"), $("します"));
console.log(nsStr.js);

// format: JavaScript Number
let num = 3+5;
nsStr = $.NSString.stringWithFormat($("num: %@"), $(num.toString()));
console.log(nsStr.js);

// Search
let nsRange = $("カワイイ苗ちゃん").rangeOfString($("苗"));
if (nsRange.location == $.NSNotFound) {
ObjC.import("Cocoa");
    console.log("Not Found")
} else {
    console.log(nsRange.location)
} //=> 4

// Last Search
let nsRange2 = $("苗ちゃん苗ちゃん苗ちゃん").rangeOfStringOptions($("苗"), $.NSBackwardsSearch);
if (nsRange2.location == $.NSNotFound) {
    console.log("Not Found")
} else {
    console.log(nsRange2.location)
} //=> 8
テキストファイルの読み書き
ObjC.import("Cocoa");

let nil = $();
let newFile = $("新規テキストファイル.txt");
let text = $("UTF-8 で書き出します\n\tエスケープシーケンスも使えます");

// Ceate Text File
let res = text.writeToFileAtomicallyEncodingError(newFile, true, $.NSUTF8StringEncoding, nil);
if (res) {
    console.log("Write Success!");
}

// Read Text File
let s = $.NSString.alloc.initWithContentsOfFileEncodingError(newFile, $.NSUTF8StringEncoding, nil);
console.log(s.js);
ディレクトリの作成と移動
ObjC.import("Cocoa");

let nil = $();
let newDir = $("新規ディレクトリ");

let fm = $.NSFileManager.defaultManager;

// Create Directory
fm.createDirectoryAtPathWithIntermediateDirectoriesAttributesError(newDir, false, nil, nil);

// Exist?
if (fm.fileExistsAtPath(newDir)) {
    console.log("Exists");
}

// Directory?
let ref = Ref();
if (fm.fileExistsAtPathIsDirectory(newDir, ref)) {
    if (ref[0])
        console.log("is Directory");
}

// Change Current Directory
fm.changeCurrentDirectoryPath(newDir);
console.log(fm.currentDirectoryPath.js);
ディレクトリ内容列挙
ObjC.import("Cocoa");

nil = $();

let path = $("~/Desktop").stringByExpandingTildeInPath;
let nsFiles = $.NSFileManager.defaultManager.contentsOfDirectoryAtPathError(path, nil);
let jsFiles = nsFiles.js; // NSArray to JS Array
for (let i=0; i<jsFiles.length; i++) {
    console.log(jsFiles[i].js);
}

// サブディレクトリの中まで探す場合
let path = $("~/Documents").stringByExpandingTildeInPath;
let nsDirEnum = $.NSFileManager.defaultManager.enumeratorAtPath(path);
while (true) {
    let name = nsDirEnum.nextObject;
    if (name.isNil()) break;
    let fullPath = path.stringByAppendingPathComponent(name);   // Full Path
    console.log(fullPath.js);
}
console.log("done");
Copyright(C) sasakima-nao All rights reserved 2002 --- 2017.