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.