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 --- 2025.