Paepoi

Paepoi » JXA Tips » JXA で Foundation

JXA で Foundation

# 最終更新日 2020.06.14

JavaScript 文字列と NSString の変換
#!/usr/bin/osascript

ObjC.import('Foundation');

// 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 (NSString)
#!/usr/bin/osascript

/**
 * 簡単なものなら readline でまかなえます
 * 複雑なものは NSString で以下のようにします
 */

ObjC.import('Foundation');

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

// stdin
let fhi = $.NSFileHandle.fileHandleWithStandardInput;
let data = fhi.availableData;
let nsStr = $.NSString.alloc.initWithDataEncoding(data, $.NSUTF8StringEncoding);
console.log(`${nsStr.js.trim()} が入力されました`)

// 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、JavaScript 文字列のままイケる\n', 'printf は');

パス名色々
#!/usr/bin/osascript

ObjC.import('Foundation');

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(`戻す ${pathC.js}`);
//=> 戻す /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/日本語
文字列色々
#!/usr/bin/osascript

ObjC.import('Foundation');

// 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));
console.log(nsStr.js);

// Search
let nsRange = $('カワイイ苗ちゃん').rangeOfString($('苗'));
if (nsRange.location == $.NSNotFound) {
    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
テキストファイルの読み書き
#!/usr/bin/osascript

ObjC.import('Foundation');

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);
ディレクトリの作成と移動
#!/usr/bin/osascript

ObjC.import('Foundation');

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);
ディレクトリ内容列挙
#!/usr/bin/osascript

ObjC.import('Foundation');

let nil = $();

let path = $('~/Documents').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 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 --- 2024.