AppleScript名:指定名称のアプリケーションプロセスが存在すればその正しい名前を返す |
— Created 2015-07-29 16:43:11 +0900 by Takaaki Naganoya — 2015 Piyomaru Software use AppleScript version "2.4" use scripting additions use framework "Foundation" set aName to "メール" set aRes to returnExactNameOfAnApp(aName) of me on returnExactNameOfAnApp(aName) tell application "System Events" set ap1List to every process whose name is equal to aName if ap1List = {} then set ap1List to every process whose displayed name is equal to aName if ap1List = {} then return false end if set anApp to contents of first item of ap1List return name of anApp end tell end returnExactNameOfAnApp |
タグ: 10.13savvy
ASOCで現在実行中のプロセスの情報を取得
AppleScript名:ASOCで現在実行中のプロセスの情報を取得 |
— Created 2015-09-08 by Takaaki Naganoya — 2015 Piyomaru Software use AppleScript version "2.4" use scripting additions use framework "Foundation" set procInfo to current application’s NSProcessInfo’s processInfo() –> (NSProcessInfo) <NSProcessInfo: 0x6000000587e0> set argList to procInfo’s arguments() –> (NSArray) {"/Applications/ASObjC Explorer 4.app/Contents/MacOS/ASObjC Explorer 4"}–ASObjC Explorer 4 set envList to procInfo’s environment() –> (NSDictionary) {PATH:"/usr/bin:/bin:/usr/sbin:/sbin", TMPDIR:"/var/folders/h4/jfhlwst88xl9z0001s7k9vk00000gr/T/", LOGNAME:"me", HOME:"/Users/me", XPC_FLAGS:"0x0", Apple_PubSub_Socket_Render:"/private/tmp/com.apple.launchd.OLjjErklL4/Render", USER:"me", SSH_AUTH_SOCK:"/private/tmp/com.apple.launchd.y3g31V3gh7/Listeners", SECURITYSESSIONID:"XXXXX", DISPLAY:"/private/tmp/com.apple.launchd.63oTa9LGKM/org.macosforge.xquartz:0", XPC_SERVICE_NAME:"au.com.myriad-com.ASObjC-Explorer-4.69328", SHELL:"/bin/xxxx", __CF_USER_TEXT_ENCODING:"0x1F8:0x1:0xE"} set anUniqueStr to procInfo’s globallyUniqueString() –> (NSString) "XXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX-XXXX-XXXXXXXXXXXXXXXX" set anID to procInfo’s processIdentifier() –> 4283–Unix Process ID (pid) set aName to procInfo’s processName() –> (NSString) "ASObjC Explorer 4" set aHostName to procInfo’s hostName() –> (NSString) "mbpretina.local" set aVersionStr to procInfo’s operatingSystemVersionString() –> (NSString) "バージョン 10.10.5(ビルド 14F27)" set aVersion to procInfo’s operatingSystemVersion() –> can’t bridge argument of type {_NSOperatingSystemVersion=qqq}. OS X 10.10ではブリッジ不可。10.11でOK set aCPUCores to procInfo’s processorCount() –> 8 set activeCPUCores to procInfo’s activeProcessorCount() –> 8 set anRAMcapacity to procInfo’s physicalMemory() –> 8.589934592E+9 set anRAMcapacity to procInfo’s systemUptime() –> 6.8344782485801E+4 set aThermalState to procInfo’s thermalState() –> 0 –NSProcessInfoThermalStateNominal (* enum { NSProcessInfoThermalStateNominal, NSProcessInfoThermalStateFair, NSProcessInfoThermalStateSerious, NSProcessInfoThermalStateCritical }; *) |
ASOCでプロセス情報を取得
AppleScript名:ASOCでプロセス情報を取得 |
— Created 2015-10-23 by Takaaki Naganoya — 2015 Piyomaru Software use AppleScript version "2.4" use scripting additions use framework "Foundation" use framework "AppKit" set runningApplications to (current application’s NSWorkspace’s sharedWorkspace()’s runningApplications()) as list repeat with i in runningApplications set aName to (i’s localizedName()) as text set anIcon to (i’s icon()) set anBundleID to (i’s bundleIdentifier()) as text set anBundleURL to (i’s bundleURL()) set tmpArch to (i’s executableArchitecture()) if tmpArch = 16777223 then set anArch to "X86_64" else if tmpArch = 7 then set anArch to "I386 " else set anArch to "Another Arch (PPC? or Error)" end if set anLaunchDate to (i’s launchDate()) set anFinishLaunch to (i’s isFinishedLaunching()) set aProcID to (i’s processIdentifier()) set anOwnMenubar to (i’s ownsMenuBar()) log {aName, tmpArch, anArch} –> (* {"CCLibrary", -1, "Another Arch (PPC?)"} *) end repeat |
NSRunningApplicationでアプリケーションプロセス情報を取得
AppleScriptで他のアプリケーションプロセスの情報を取得するには、OS標準装備のSystem Eventsに対して、
tell application "System Events" set aProp to properties of process "Safari" end tell --> {has scripting terminology:true, bundle identifier:"com.apple.Safari", file:alias "Macintosh HD:Applications:Safari.app:" of application "System Events", creator type:"sfri", subrole:missing value, entire contents:{}, selected:missing value, application file:alias "Cherry:Applications:Safari.app:" of application "System Events", orientation:missing value, role:"AXApplication", accepts high level events:true, file type:"APPL", value:missing value, position:missing value, id:909534, displayed name:"Safari", name:"Safari", class:application process, background only:false, frontmost:false, size:missing value, visible:true, Classic:false, role description:"application", maximum value:missing value, architecture:"x86_64", partition space used:0, short name:"Safari", focused:missing value, minimum value:missing value, help:missing value, title:"Safari", accepts remote events:false, total partition size:0, description:"application", accessibility description:missing value, enabled:missing value, unix id:3386}
などと操作することになります。ただし、System Eventsがつねに使えるわけではありません。
Mac App Storeに出すアプリケーションの中だと、些細な用途に他のアプリケーションを呼び出そうとしても、よほどの理由がないかぎり通りません(リジェクトされます)。Dark Mode/Light Modeの検出に安直にSystem Eventsを使おうとしてリジェクトされた経験があります。
そこで、他のサービス(shell commandとか、Cocoa Frameworkとか)を経由して機能を呼び出すことになります。まったく同じことができるわけではありませんが、1つの目的に対して複数の方法を用意しておくのはセオリーです。OS側でバグを作られた場合の回避策とか(正しくないOSバージョンを返してくるmacOSがありました)、目的に応じて利用に制限がかかる用途(まさにMac App Storeがそれです)があるためです。
AppleScript名:NSRunningApplicationでアプリケーションプロセス情報を取得 |
— Created 2017-09-17 15:27:23 +0900 by Takaaki Naganoya — 2017 Piyomaru Software use AppleScript version "2.4" use scripting additions use framework "Foundation" use framework "AppKit" set aBundleID to "com.apple.Safari" set appArray to current application’s NSRunningApplication’s runningApplicationsWithBundleIdentifier:aBundleID if appArray’s |count|() = 0 then its return set appItem to appArray’s objectAtIndex:0 set iconRes to (appItem’s icon()) (* –> (NSImage) <NSImage 0x618001478f40 Size={32, 32} Reps=( "<NSIconRefImageRep:0x61800029b300 iconRef=0x8403 size:128×128 pixels:128×128>", "<NSIconRefImageRep:0x61800089f7c0 iconRef=0x8403 size:128×128 pixels:256×256>", "<NSIconRefImageRep:0x6180006989c0 iconRef=0x8403 size:256×256 pixels:256×256>", "<NSIconRefImageRep:0x61800129f040 iconRef=0x8403 size:256×256 pixels:512×512>", "<NSIconRefImageRep:0x618000898dd0 iconRef=0x8403 size:512×512 pixels:512×512>", "<NSIconRefImageRep:0x61800029a270 iconRef=0x8403 size:48×48 pixels:48×48>", "<NSIconRefImageRep:0x618000691490 iconRef=0x8403 size:36×36 pixels:36×36>", "<NSIconRefImageRep:0x618000c8e100 iconRef=0x8403 size:36×36 pixels:72×72>", "<NSIconRefImageRep:0x618000a80460 iconRef=0x8403 size:32×32 pixels:32×32>", "<NSIconRefImageRep:0x6180004899c0 iconRef=0x8403 size:32×32 pixels:64×64>", "<NSIconRefImageRep:0x61800089db50 iconRef=0x8403 size:18×18 pixels:18×18>", "<NSIconRefImageRep:0x618001291530 iconRef=0x8403 size:18×18 pixels:36×36>", "<NSIconRefImageRep:0x618000c8e0b0 iconRef=0x8403 size:16×16 pixels:16×16>", "<NSIconRefImageRep:0x618000880280 iconRef=0x8403 size:16×16 pixels:32×32>", "<NSIconRefImageRep:0x618000e99a50 iconRef=0x8403 size:512×512 pixels:1024×1024>" )> *) set locRes to (appItem’s localizedName()) as string –> "Safari" set bID to (appItem’s bundleIdentifier()) as string –> "com.apple.Safari" set bURL to (appItem’s bundleURL()) as string –> "Cherry:Applications:Safari.app:" set arch to (appItem’s executableArchitecture()) –> 16777223 set exeURL to (appItem’s executableURL()) –> (NSURL) file:///Applications/Safari.app/Contents/MacOS/Safari set launchDate to (appItem’s launchDate()) –> (NSDate) 2017-09-13 01:58:16 +0000 set launchFinish to (appItem’s finishedLaunching) as integer –> 1 set pID to (appItem’s processIdentifier) as integer –> 11877 set oenMenu to (appItem’s ownsMenuBar()) as boolean –> false |
アプレットのアイコンをDockに出さない2
AppleScript名:アプレットのアイコンをDockに出さない2 |
— Created 2015-10-22 by Takaaki Naganoya — 2015 Piyomaru Software use AppleScript version "2.4" use scripting additions use framework "Foundation" use framework "AppKit" –Dockアイコン非表示、dialogも出ない current application’s NSApp’s setActivationPolicy:(current application’s NSApplicationActivationPolicyProhibited) repeat with i from 1 to 10 tell current application display notification (i as text) delay 1 end tell end repeat quit |
Dockとメニューバーを隠す→戻す
AppleScript名:Dockとメニューバーを隠す→戻す |
— Created 2017-03-15 by Takaaki Naganoya — 2017 Piyomaru Software use AppleScript version "2.4" use scripting additions use framework "Foundation" use framework "AppKit" –Main MenuとDockを隠す current application’s NSApplication’s sharedApplication()’s setPresentationOptions:10 –NSApplicationPresentationHideMenuBar | NSApplicationPresentationHideDock delay 10 –MenuとDockを通常に戻す current application’s NSApplication’s sharedApplication()’s setPresentationOptions:(current application’s NSApplicationPresentationDefault) |
Dockアイコンにプログレスバーを追加
Dockアイコンにプレグレスバーを描画するAppleScriptです。
書き方のクセがあからさまに違うこの内容は、Edama2さんからいただいたものですね、コレ。
AppleScript名:Dockアイコンにプログレスバーを追加 |
use AppleScript use framework "Foundation" use scripting additions on run set max to 100 repeat with num from 1 to max my progDockTile(max, num) delay 0.1 end repeat #アイコンを元に戻す current application’s NSApp’s setApplicationIconImage:(current application’s NSImage’s imageNamed:"NSApplicationIcon") end run #Dockアイコンにプログレスバーを追加 on progDockTile(max, current) set appIcon to current application’s NSImage’s imageNamed:"NSApplicationIcon" set iconSize to appIcon’s |size|() tell (current application’s NSImage’s alloc()’s initWithSize:iconSize) lockFocus() appIcon’s dissolveToPoint:(current application’s NSZeroPoint) fraction:1.0 set n to (iconSize’s width) / 16 #プログレスバーの長方形 set myRect to current application’s NSMakeRect(n / 2, n, n * 15, n * 1.6) –>{origin:{x:4.0, y:8.0}, |size|:{width:120.0, height:12.800000190735}} tell (current application’s NSBezierPath’s ¬ bezierPathWithRoundedRect:myRect ¬ xRadius:(myRect’s |size|’s height) / 2 ¬ yRadius:(myRect’s |size|’s height) / 2) current application’s (NSColor’s colorWithWhite:1.0 alpha:0.4)’s |set|() –>背景色 fill() current application’s NSColor’s whiteColor()’s |set|() –>枠色 stroke() end tell if current is greater than 0 then if current is greater than max then set current to max set myRect’s |size|’s width to (myRect’s |size|’s width) / max * current tell (current application’s NSBezierPath’s ¬ bezierPathWithRoundedRect:myRect ¬ xRadius:(myRect’s |size|’s height) / 2 ¬ yRadius:(myRect’s |size|’s height) / 2) set strartColor to current application’s NSColor’s colorWithRed:0.15 green:0.55 blue:1 alpha:0.8 set endColor to strartColor’s shadowWithLevel:0.7 set grad to current application’s NSGradient’s alloc()’s initWithStartingColor:strartColor endingColor:endColor grad’s drawInBezierPath:it angle:270.0 end tell end if unlockFocus() current application’s NSApp’s setApplicationIconImage:it end tell return (current + 1) end progDockTile |
アプリケーションのDockアイコンに文字列をバッジ表示(5文字まで)
AppleScript名:アプリケーションのDockアイコンに文字列をバッジ表示(5文字まで) |
use AppleScript version "2.4" use scripting additions use framework "Foundation" use framework "AppKit" –初版では入っておらず、環境によってはクラッシュした。後から追記 showDockBadge_("") delay 1 showDockBadge_("77777") –Max 5 文字 delay 5 showDockBadge_("") –Dockのアプリケーションアイコンに指定文字をバッジ表示 on showDockBadge:theText set theDockTile to current application’s NSApp’s dockTile() theDockTile’s setBadgeLabel:theText theDockTile’s display() end showDockBadge: |
Dockアイコンをバウンドさせる
対象のアプリケーションが最前面にいるとDock上でアイコンがバウンドしないので、強制的に他のアプリケーション(Finder)を最前面に出してから実行しています。
AppleScript名:Dockアイコンをバウンドさせる |
— Created 2015-09-08 by Takaaki Naganoya — 2015 Piyomaru Software use AppleScript version "2.4" use scripting additions use framework "Foundation" use framework "AppKit" tell application "Finder" to activate –Script Editor/ASObjC Explorer 4を背面に set anApp to current application’s NSApplication’s sharedApplication() anApp’s requestUserAttention:(current application’s NSCriticalRequest) |
指定ファイルからカスタムアイコンを削除する
AppleScript名:指定ファイルからカスタムアイコンを削除する |
— Created 2015-10-19 by Takaaki Naganoya — 2015 Piyomaru Software use AppleScript version "2.4" use scripting additions use framework "Foundation" use framework "AppKit" set aFile to POSIX path of (choose file with prompt "Choose Target File") –設定対象のファイル set aSW to current application’s NSWorkspace’s sharedWorkspace() aSW’s setIcon:(missing value) forFile:aFile options:0 |
指定ファイルに指定アイコン画像をつける
AppleScript名:指定ファイルに指定アイコン画像をつける |
— Created 2015-10-19 by Takaaki Naganoya — 2015 Piyomaru Software use AppleScript version "2.4" use scripting additions use framework "Foundation" use framework "AppKit" set aPath to POSIX path of (choose file of type {"com.apple.icns", "public.tiff"} with prompt "Choose Icon File") –アイコンファイル set aFile to POSIX path of (choose file with prompt "Choose Target File") –設定対象のファイル set aURL to current application’s |NSURL|’s fileURLWithPath:aPath set aImage to current application’s NSImage’s alloc()’s initWithContentsOfURL:aURL set aSW to current application’s NSWorkspace’s sharedWorkspace() aSW’s setIcon:aImage forFile:aFile options:0 |
指定フォルダからカスタムアイコンを削除する v3
指定のフォルダに指定されていたアイコン画像を削除するAppleScriptです。
特定のフォルダを監視して、ファイルが追加されたり削除されたりすると、指定のAppleScriptを実行する仕組み「フォルダアクション」がmacOSに標準装備されています。
フォルダアクションはフォルダアクションでいいのですが、あまり融通が効かないので、フォルダアクションを使わずにAppleScript独自でフォルダを監視することはよくあります。
そして、監視対象に指定したフォルダのアイコンを変更し、わかりやすく「監視対象である」ことをユーザーに伝えることも、よくある話です。そして、監視処理が終了したあとでフォルダのアイコンをOS標準の元のものに戻しておく必要があります。本Scriptはそういう処理に用いるものです。
AppleScript名:指定フォルダからカスタムアイコンを削除する v3 |
— Created 2015-10-21by Takaaki Naganoya — 2015 Piyomaru Software use AppleScript version "2.4" use scripting additions use framework "Foundation" use framework "AppKit" set aFolder to POSIX path of (choose folder with prompt "Choose Target Folder") –カスタムアイコン削除対象のフォルダ removeCustomIcon(aFolder) of me on removeCustomIcon(aFolder) set aSW to current application’s NSWorkspace’s sharedWorkspace() aSW’s setIcon:(missing value) forFile:aFolder options:0 –Erase tell application "Finder" update ((POSIX file aFolder) as alias) –Refresh State end tell end removeCustomIcon |
指定フォルダに指定アイコン画像をつける v3
指定のフォルダに指定アイコン画像をつけるAppleScriptです。
特定のフォルダを監視して、ファイルが追加されたり削除されたりすると、指定のAppleScriptを実行する仕組み「フォルダアクション」がmacOSに標準装備されています。
フォルダアクションはフォルダアクションでいいのですが、あまり融通が効かないので、フォルダアクションを使わずにAppleScript独自でフォルダを監視することはよくあります。
そして、監視対象に指定したフォルダのアイコンを変更し、わかりやすく「監視対象である」ことをユーザーに伝えることも、よくある話です。本Scriptはそういう処理に用いるものです。
もちろん、処理が終了したあとは監視対象フォルダのアイコンは元に戻しておくべきで、「指定フォルダからカスタムアイコンを削除する v3」とペアで使っています。
AppleScript名:指定フォルダに指定アイコン画像をつける v3 |
— Created 2015-10-21 by Takaaki Naganoya — 2015 Piyomaru Software use AppleScript version "2.4" use scripting additions use framework "Foundation" use framework "AppKit" set anIconPath to POSIX path of (choose file of type {"com.apple.icns", "public.tiff"} with prompt "Choose Icon File") set aFolder to POSIX path of (choose folder with prompt "Choose Folder") setCustomIcon(anIconPath, aFolder) of me on setCustomIcon(aPath, aFolder) set aFolderPath to current application’s NSString’s stringWithString:aFolder set aURL to current application’s |NSURL|’s fileURLWithPath:aPath set aImage to current application’s NSImage’s alloc()’s initWithContentsOfURL:aURL set aSW to current application’s NSWorkspace’s sharedWorkspace() aSW’s setIcon:(missing value) forFile:aFolder options:0 –Erase tell application "Finder" update ((POSIX file aFolder) as alias) –Refresh State end tell aSW’s setIcon:aImage forFile:aFolderPath options:0 –Write tell application "Finder" update ((POSIX file aFolder) as alias) –Refresh State end tell end setCustomIcon |
指定ファイルのxattrの削除(ダウンロードしたファイルが開けないときに)
AppleScript名:指定ファイルのxattrの削除(ダウンロードしたファイルが開けないときに) |
use AppleScript version "2.4" use scripting additions use framework "Foundation" use framework "XAttribute" –https://github.com/rylio/OTMXAttribute set dlFullPath to POSIX path of (choose file) set xRes to removeXAttrFromFile(dlFullPath, "com.apple.quarantine") on removeXAttrFromFile(aFile, anXattr) –Get Xattr String set anAttribute to (current application’s OTMXAttribute’s stringAttributeAtPath:aFile |name|:anXattr |error|:(missing value)) if anAttribute = missing value then return true –There is no use to remove xattr –Remove Xattr set xRes to (current application’s OTMXAttribute’s removeAttributeAtPath:aFile |name|:anXattr |error|:(missing value)) if xRes = missing value then return false return (xRes as boolean) end removeXAttrFromFile |
指定EnumがどのFrameworkに所属しているか検索 v2
AppleScript名:指定EnumがどのFrameworkに所属しているか検索 v2 |
— Created 2017-10-13 by Takaaki Naganoya — 2017 Piyomaru Software use AppleScript version "2.4" use scripting additions use framework "Foundation" use framework "AppKit" property NSFileManager : a reference to current application’s NSFileManager property NSString : a reference to current application’s NSString property NSPredicate : a reference to current application’s NSPredicate property NSMutableArray : a reference to current application’s NSMutableArray property NSUTF8StringEncoding : a reference to current application’s NSUTF8StringEncoding set a1Res to searchEnumFromHeaderFiles("NSUTF8StringEncoding") of me –> {"DiscRecording.framework", "Foundation.framework", "SpriteKit.framework"} set a2Res to searchEnumFromHeaderFiles("NSNumberFormatterRoundUp") of me –> {"Foundation.framework"} set a3Res to searchEnumFromHeaderFiles("NSParagraphStyleAttributeName") of me –> {"AppKit.framework"} on searchEnumFromHeaderFiles(targString) set aClass to current application’s NSClassFromString(targString) if aClass is not equal to missing value then return false set dPath to POSIX path of (path to application id "com.apple.dt.Xcode") set aFol to dPath & "Contents/Developer/Platforms/MacOSX.platform/" & "Developer/SDKs/MacOSX.sdk/System/Library/Frameworks" set bList to retFullPathWithinAFolderWithRecursiveFilterByExt(aFol, "h") of me set matchedList to {} repeat with i in bList set j to contents of i set aStr to (NSString’s stringWithContentsOfFile:j encoding:NSUTF8StringEncoding |error|:(missing value)) if aStr ≠ missing value then set aRange to (aStr’s rangeOfString:targString) if aRange’s location() ≠ current application’s NSNotFound and (aRange’s location()) < 9.99999999E+8 then set tmpStr to (current application’s NSString’s stringWithString:j) set pathList to tmpStr’s pathComponents() set thePred to (current application’s NSPredicate’s predicateWithFormat:"pathExtension == ’framework’") set aRes to (pathList’s filteredArrayUsingPredicate:thePred)’s firstObject() as text set the end of matchedList to aRes end if end if end repeat set aArray to current application’s NSArray’s arrayWithArray:matchedList set bArray to aArray’s valueForKeyPath:"@distinctUnionOfObjects.self" return bArray as list end searchEnumFromHeaderFiles –指定フォルダ以下のすべてのファイルを再帰で取得(拡張子で絞り込み) on retFullPathWithinAFolderWithRecursiveFilterByExt(aFol, aExt) set anArray to NSMutableArray’s array() set aPath to NSString’s stringWithString:aFol set dirEnum to NSFileManager’s defaultManager()’s enumeratorAtPath:aPath repeat set aName to (dirEnum’s nextObject()) if aName = missing value then exit repeat set aFullPath to aPath’s stringByAppendingPathComponent:aName anArray’s addObject:aFullPath end repeat set thePred to NSPredicate’s predicateWithFormat:"pathExtension == [c]%@" argumentArray:{aExt} set bArray to anArray’s filteredArrayUsingPredicate:thePred return bArray as list end retFullPathWithinAFolderWithRecursiveFilterByExt |
指定クラスがどのFrameworkに所属しているか検索 v3
AppleScript名:指定クラスがどのFrameworkに所属しているか検索 v3 |
— Created 2017-10-14 by Shane Stanley — Modified 2017-10-14 by Takaaki Naganoya use AppleScript version "2.4" use scripting additions use framework "Foundation" set fRes1 to searchClassInFrameworks("JSContext") of me –> "JavaScriptCore.framework" set fRes2 to searchClassInFrameworks("NSApplication") of me –> "AppKit.framework" set fRes3 to searchClassInFrameworks("NSRect") of me –> false set fRes4 to searchClassInFrameworks("PDFPage") of me –> "Quartz.framework" set fRes5 to searchClassInFrameworks("NSUTF8StringEncoding") of me –> false set fRes6 to searchClassInFrameworks("CIColor") of me –> "CoreImage.framework" on searchClassInFrameworks(aTarget) set aClass to current application’s NSClassFromString(aTarget) if aClass = missing value then return false set theComponenents to (current application’s NSBundle’s bundleForClass:aClass)’s bundleURL’s pathComponents() set thePred to current application’s NSPredicate’s predicateWithFormat:"pathExtension == ’framework’" set aRes to (theComponenents’s filteredArrayUsingPredicate:thePred)’s firstObject() as text return aRes end searchClassInFrameworks |
指定スクリプト書類の記述OSA言語を取得する v2
AppleScript名:指定スクリプト書類の記述OSA言語を取得する v2 |
— Created 2017-06-04 by Takaaki Naganoya — 2017 Piyomaru Software use AppleScript version "2.4" use scripting additions use framework "Foundation" use framework "OSAKit" set anAlias to choose file of type {"com.apple.applescript.script", "com.apple.applescript.script-bundle"} set sRes to getOSALangKindFromScriptFile(anAlias) of me –> {osaName:"AppleScript", osaDesc:"AppleScript.", osaVer:"2.5"} –> {osaName:"JavaScript", osaDesc:"JavaScript", osaVer:"1.1"} on getOSALangKindFromScriptFile(anAlias) set aURL to current application’s |NSURL|’s fileURLWithPath:(POSIX path of anAlias) set theScript to current application’s OSAScript’s alloc()’s initWithContentsOfURL:aURL |error|:(missing value) set scriptName to theScript’s |language|()’s |name|() as string set scriptDesc to theScript’s |language|()’s info() as string set scriptVer to theScript’s |language|()’s |version|() as string return {osaName:scriptName, osaDesc:scriptDesc, osaVer:scriptVer} end getOSALangKindFromScriptFile |
データのClassを求める
データのclassを求めるAppleScriptです。
AppleScriptではもともと、
class of 変数
で、変数に入っているデータのclassが求められます。ただ、CocoaのオブジェクトのClassは求められないので、このようなScriptを書いてみた次第です。
AppleScript名:データのClassを求める |
use AppleScript version "2.4" use scripting additions use framework "Foundation" set theValue to "10" set aClass to getClassFromData(theValue) of me –> "text" set cRes to getClassFromData(current application’s NSArray’s arrayWithArray:{1, 2, 3}) of me –> "NSArray" tell application "System Events" set a to process "Finder" end tell set dClass to getClassFromData(a) of me –> "application process" tell application "Safari" if running then if (count of every document) > 0 then set a to front document set eClass to getClassFromData(a) of me –> "document" end if end if end tell on getClassFromData(aData) set aRes to (count {aData} each reference) if aRes = 0 then –Pure AppleScript Object try return (class of aData) as string on error return false end try else –NSObject set nsObjRes to getClassNameStringFromObject(aData) of me if nsObjRes = false then –Maybe application Object return (class of aData) as string else return nsObjRes –NSObject end if end if end getClassFromData on getClassNameStringFromObject(aObject) set classList to {"AddressBook", "AVAsset", "AVAssetExportSession", "AVAudioPlayer", "CGPointZero", "CGPostMouseEvent", "CIColor", "CIFilter", "CIImage", "CIVector", "CLLocation", "CLLocationManager", "CWInterface", "EKAlarm", "EKEventStore", "EKStructuredLocation", "FSEvent", "IOBluetoothDevice", "IOBluetoothHostController", "ITLibrary", "JSContext", "MKMapView", "Myriad Helpers", "NSAffineTransform", "NSAlert", "NSAnimationContext", "NSApp", "NSApplication", "NSArray", "NSAttributedString", "NSAutoreleasePool", "NSBezierPath", "NSBitmapImageRep", "NSBox", "NSBundle", "NSButton", "NSByteCountFormatter", "NSCalendar", "NSCharacterSet", "NSClassFromString", "NSColor", "NSColorList", "NSColorSpace", "NSColorWell", "NSComboBox", "NSCompoundPredicate", "NSCountedSet", "NSData", "NSDataDetector", "NSDate", "NSDateComponents", "NSDateFormatter", "NSDateIntervalFormatter", "NSDatePicker", "NSDecimalNumber", "NSDictionary", "NSEnergyFormatter", "NSError", "NSEvent", "NSFileManager", "NSFileSystemFreeSize", "NSFont", "NSFontCollection", "NSFontManager", "NSGraphicsContext", "NSHelpManager", "NSHomeDirectory", "NSHost", "NSImage", "NSImageView", "NSIndexSet", "NSIntersectionRect", "NSInvocationOperation", "NSJSONSerialization", "NSLengthFormatter", "NSLinguisticTagger", "NSLocale", "NSLocaleIdentifier", "NSLog", "NSMakePoint", "NSMakeRange", "NSMakeRect", "NSMapTable", "NSMassFormatter", "NSMatrix", "NSMenuItem", "NSMetadataQuery", "NSMutableArray", "NSMutableAttributedString", "NSMutableCharacterSet", "NSMutableData", "NSMutableDictionary", "NSMutableIndexSet", "NSMutableSet", "NSMutableString", "NSMutableURLRequest", "NSNetServiceBrowser", "NSNotificationCenter", "NSNumber", "NSNumberFormatter", "NSNumberFormatterRoundDown", "NSNumberFormatterRoundUp", "NSOpenPanel", "NSOperationQueue", "NSOrderedSet", "NSPasteboard", "NSPasteboardItem", "NSPipe", "NSPNGFileType", "NSPointInRect", "NSPopUpButton", "NSPredicate", "NSPrinter", "NSPrintInfo", "NSPrintOperation", "NSProcessInfo", "NSPropertyListFormat", "NSPropertyListImmutable", "NSPropertyListSerialization", "NSRange", "NSRect", "NSRegularExpression", "NSRegularExpressionAnchorsMatchLines", "NSRegularExpressionDotMatchesLineSeparators", "NSRegularExpressionSearch", "NSRunningApplication", "NSSavePanel", "NSScanner", "NSScreen", "NSScriptCommand", "NSSegmentedControl", "NSSet", "NSShadow", "NSSharingService", "NSSlider", "NSSortDescriptor", "NSSound", "NSSpeechRecognizer", "NSSpeechSynthesizer", "NSSpellChecker", "NSSplitView", "NSStatusBar", "NSString", "NSTableColumn", "NSTableView", "NSTask", "NSTextField", "NSTextView", "NSThread", "NSTimeInterval", "NSTimer", "NSTimeZone", "NSUnarchiver", "NSUnionRect", "NSURL", "NSURLComponents", "NSURLConnection", "NSURLDownload", "NSURLQueryItem", "NSURLRequest", "NSURLRequestReloadIgnoringLocalCacheData", "NSUserDefaults", "NSUTF8StringEncoding", "NSUUID", "NSView", "NSWeekCalendarUnit", "NSWindow", "NSWindowController", "NSWorkspace", "NSXMLParser", "NSZeroRect", "NSZeroSize", "ODNode", "ODQuery", "ODSession", "OSAScript", "OSAScriptController", "OSAScriptView", "PDFAnnotation", "PDFDestination", "PDFDocument", "PDFOutline", "PDFPage", "PDFThumbnailView", "PDFView", "QCView", "SBApplication", "WebView", "WKWebView"} repeat with i in classList set j to contents of i set aClass to current application’s NSClassFromString(j) try set aRes to (aObject’s isKindOfClass:aClass) as boolean on error –May be an Application Object return false end try if aRes = true then return j end repeat return false end getClassNameStringFromObject |
asHTMLexportLib v2
指定のAppleScript書類をスクリプトエディタでオープンし、書式情報を読み取ってURLリンク付きのHTML(テキスト)を生成するAppleScriptです。AppleScript Librariesとして他のScriptから呼び出して利用しています。
オリジナルは2006年ごろに作成したもので、「秘伝のタレ」よろしくその時々のOSの変更を反映させて使い続けています。
AppleScriptの書式(とくに色情報)をHTML書き出し時にどのように反映させるかについては、いろいろと「流派」があり、
・スクリプトエディタ上の色情報を読み取ってそのままカラータグで展開する派
・CSSなどで構文要素ごとにスタイルを指定する派
で、本Scriptは前者の方式で書かれた最古のScriptの末裔です。書き出しHTMLが長くなるというデメリットはあるものの、構造の単純さが幸いしてわずかな修正でメンテナンスを継続できています。
当初、AppleScriptからスクリプトエディタをコントロールすると不具合が多く、他のAppleScript開発環境(Script Debugger)からの実行を余儀なくされていました。macOS 10.6あたりでずいぶん安定して利用できるようになってきた記憶があります(10.3とか10.4はいま思い出しても辛かった)。
HTMLに埋め込むURLスキーム「applescript:」からは、AppleScriptの新規作成、作成中のAppleScript書類のカーソル位置へのペースト、書類末尾へのペーストなどの動作を指定できますが、結局Blogに10年前からつけているURLリンクもそれほど認識されておらず(なぜ??)、新規作成のリンクのみ付加するように変更しました。
また、「applescript:」のURLリンクでは生成するAppleScript書類のファイル名をあらかじめ指定できるようになっているものの、古いバージョンのmacOS(Mac OS X)ではこの名称指定が仇となってURLリンクが認識されないという問題が発生するため、名称も指定していません。
一応、書き出し対象ファイルがAppleScriptかJavaScriptかを判定して、書き出し時のカラーリングを変更するようになっています。OSAScriptフレームワーク経由で書類から直接OSA言語の種別は取得できるものの、スクリプトエディタ自体から情報を取得しても手間はたいして変わらないので現状のようになっています。
AppleScript名:asHTMLexportLib |
use AppleScript version "2.4" use scripting additions use framework "Foundation" property quotChar : string id 34 property headerCol : "0000CC" –"0000CC" –ヘッダー部分(濃い色) property bodyBackCol : "EEFFFF" –"EEFFFF" –Script本文下地(薄い色) property footerCol : "66FFFF" –"66FFFF" –スクリプトリンク部分 property repMark : "_replacepoint_" on run set aPath to choose file of type {"com.apple.applescript.script", "com.apple.applescript.script-bundle"} set aRes to retScriptHTML(aPath) of me end run on retScriptHTML(aPath) –parameter is alias script spd property TIDsList : {} property dataOut : {} property textList : {} property colorList : {} end script set pName to "com.apple.ScriptEditor2" tell application id pName set asDoc to open aPath tell asDoc –front document set aInfo to properties set curLang to name of language of aInfo –現在のOSA言語の名称を取得する end tell –OSA Language名称をもとに色セットを変更する changeColor(curLang) of me set c to name of asDoc –front document set aF to aPath as string –retMacOSpathList(aPath) of me set contText to getContentsOfFile(asDoc) of me –front document set encText to makeEncodedScript(contText) of me set newLinkText to "applescript://com.apple.scripteditor?action=new&script=" & encText –set insLinkText to "applescript://com.apple.scripteditor?action=insert&script=" & encText –set apndLinkText to "applescript://com.apple.scripteditor?action=append&script=" & encText set comText to description of asDoc –front document set (textList of spd) to getAttributeRunOfFile(asDoc) of me —every attribute run of asDoc –front document set (colorList of spd) to getColorOfAttributeRunOfFile(asDoc) of me —color of every attribute run of asDoc –front document end tell set tabChar to string id 9 set (TIDsList of spd) to {{"\\", "\"}, {"’", "’"}, {"&", "&"}, {">", ">"}, {"<", "<"}, {" ", " "}, {string id 13, "<br>"}, {string id 10, "<br>"}, {"\"", """}} set (dataOut of spd) to {} set iCounter to 1 repeat with i in (textList of spd) set j to contents of i set curDelim to AppleScript’s text item delimiters repeat with eachItem in (TIDsList of spd) set AppleScript’s text item delimiters to contents of item 1 of eachItem set j to every text item of j set AppleScript’s text item delimiters to contents of item 2 of eachItem set j to j as string end repeat set AppleScript’s text item delimiters to curDelim set cText to RBG2HTML(item iCounter of (colorList of spd)) of me set the end of (dataOut of spd) to "<font color=" & cText & ">" & j & "</font>" set iCounter to iCounter + 1 end repeat set htmlHeader to "<table width=" & quotChar & "100%" & quotChar & " border=" & quotChar & "0" & quotChar & "cellspacing=" & quotChar & "2" & quotChar & " cellpadding=" & quotChar & "2" & quotChar & "> <tr> <td bgcolor=\"#" & headerCol & "\"><font color=" & quotChar & "#FFFFFF" & quotChar & ">" & curLang & "名:" & c if comText is not equal to "" then set comText to "<br><font size=" & quotChar & "2" & quotChar & ">【Comment】 " & comText & "</font><br>" end if set htmlHeader2 to "</font></td> </tr> <tr> <td bgcolor=\"#" & bodyBackCol & "\"><font size=\"3\">" set htmlFooter1 to "</font></td> </tr> <tr> <td bgcolor=\"#" & footerCol & "\"><p><font size=\"2\"><a href=\"" & newLinkText & "\">★Click Here to Open This Script</a> </font></p> </td> </tr> </table> " set dataText to htmlHeader & comText & htmlHeader2 & ((dataOut of spd) as text) & htmlFooter1 set dataText to dataText as Unicode text tell application id pName close asDoc without saving –close front document without saving end tell return dataText end retScriptHTML on makeEncodedScript(contText) set aList to every paragraph of contText set aClass to class of aList if aClass = list then set aLen to length of aList else set aLen to 1 end if set aaList to {} set delim to AppleScript’s text item delimiters set AppleScript’s text item delimiters to repMark set bList to aList as text set AppleScript’s text item delimiters to delim set aaList to (retURLencodedStrings(bList) of me) as text set search_string to retURLencodedStrings(repMark) of me –"%5Freplacepoint%5F" as text set replacement_string to "%0D" as text set bList to replace_chars(aaList, search_string, replacement_string) of me return bList end makeEncodedScript –RGB値からHTMLの色指定に変換 on RBG2HTML(RGB_values) — NOTE: this sub-routine expects the RBG values to be from 0 to 65536 set the hex_list to {"0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", "F"} set the the hex_value to "" repeat with i from 1 to the count of the RGB_values set this_value to (item i of the RGB_values) div 256 if this_value is 256 then set this_value to 255 set x to item ((this_value div 16) + 1) of the hex_list set y to item (((this_value / 16 mod 1) * 16) + 1) of the hex_list set the hex_value to (the hex_value & x & y) as string end repeat return ("#" & the hex_value) as string end RBG2HTML on replace_chars(this_text, search_string, replacement_string) set AppleScript’s text item delimiters to the search_string set the item_list to every text item of this_text set AppleScript’s text item delimiters to the replacement_string set this_text to the item_list as string set AppleScript’s text item delimiters to "" return this_text end replace_chars on retURLencodedStrings(aText) set aStr to current application’s NSString’s stringWithString:aText set encodedStr to aStr’s stringByAddingPercentEncodingWithAllowedCharacters:(current application’s NSCharacterSet’s alphanumericCharacterSet()) return encodedStr as text end retURLencodedStrings on changeColor(aLang) if aLang = "AppleScript" then set headerCol to "0000CC" –"0000CC" –ヘッダー部分(濃い色) set bodyBackCol to "EEFFFF" –"EEFFFF" –Script本文下地(薄い色) set footerCol to "66FFFF" –"66FFFF" –スクリプトリンク部分 else if aLang = "JavaScript" then set headerCol to "804000" –"0000CC" –ヘッダー部分(濃い色) set bodyBackCol to "E2D3D3" –"EEFFFF" –Script本文下地(薄い色) set footerCol to "E7AC53" –"66FFFF" –スクリプトリンク部分 end if end changeColor on getContentsOfFile(asDoc) tell application id "com.apple.ScriptEditor2" set aCon to (properties of asDoc) end tell return contents of aCon end getContentsOfFile on getAttributeRunOfFile(asDoc) tell application id "com.apple.ScriptEditor2" set aCon to (every attribute run of asDoc) end tell return aCon end getAttributeRunOfFile on getColorOfAttributeRunOfFile(asDoc) tell application id "com.apple.ScriptEditor2" set aCon to color of (every attribute run of asDoc) end tell return aCon end getColorOfAttributeRunOfFile |
WordPress XML-RPC Frameworkのじっけん
WordPress XML-RPC Frameworkを呼び出して、指定のWordPressとXML-RPCによる通信を行うテスト用のAppleScriptです。
# 本BlogではAppleScriptからの自動更新時以外はWordPressのXML-RPC通信機能をプラグイン「Disable XML-RPC」によって止めているので、本Scriptを実行してもエラーになる可能性があります。他のWordPressのサイトでお試しください
本Blogがホスティング業者との行き違いでデータベースをシャットダウンされて、やむなく再構築を行おうと決意してから迅速に再構築を進めて来られたのは、手元にAppleScriptの元コードがすべて無傷で残っていたことと、これまで半自動だった記事の投稿をすべてAppleScriptから自動化できる目処が立っていたためでした。
・指定のAppleScriptをHTML化(URLリンク付き)するAppleScriptライブラリ
・指定内容のHTMLをWordPressにXML-RPC経由で投稿するAppleScript
といった「飛び道具」を整備することで、指定のAppleScript書類をWordPressに投稿できるようになりました。
とくに、XML-RPCについてはAppleScriptの標準搭載命令「call xmlrpc」がとことん使い物にならず、WordPressへの通信を行うとクラッシュすることを(ずいぶん昔に)確認してあったため、、、かわりになる部品を地道に探してありました。
WordPressとのXML-RPCによる通信を行うmacOS用フレームワーク「wpxmlrpc」を見つけ、Xcode上でビルドしてAppleScriptから呼び出す実験を行い、このように実際の投稿に利用しています。Github上のドキュメントはたいへんに素っ気なく、そのままObjective-CのコードをAppleScriptに置き換えても動作しない程度の素朴すぎる内容でしたが、REST APIの呼び出しAppleScriptを参考に内容を類推してひととおり動作できるところまでこぎつけました。
AppleScript名:WordPress XML-RPC Frameworkのじっけん |
— Created 2018-02-08 by Takaaki Naganoya — 2018 Piyomaru Software use AppleScript version "2.5" use scripting additions use framework "Foundation" use framework "wpxmlrpc" –https://github.com/wordpress-mobile/wpxmlrpc set aRes to callXMLRPC("http://piyocast.com/as/xmlrpc.php", "demo.addTwoNumbers", {2, 3}) of me –> 5 set aRes to callXMLRPC("http://piyocast.com/as/xmlrpc.php", "mt.supportedMethods", {}) of me –> {"wp.getUsersBlogs", "wp.newPost", "wp.editPost", "wp.deletePost", "wp.getPost", "wp.getPosts", "wp.newTerm", "wp.editTerm", "wp.deleteTerm", "wp.getTerm", "wp.getTerms", "wp.getTaxonomy", "wp.getTaxonomies", "wp.getUser", "wp.getUsers", "wp.getProfile", "wp.editProfile", "wp.getPage", "wp.getPages", "wp.newPage", "wp.deletePage", "wp.editPage", "wp.getPageList", "wp.getAuthors", "wp.getCategories", "wp.getTags", "wp.newCategory", "wp.deleteCategory", "wp.suggestCategories", "wp.uploadFile", "wp.deleteFile", "wp.getCommentCount", "wp.getPostStatusList", "wp.getPageStatusList", "wp.getPageTemplates", "wp.getOptions", "wp.setOptions", "wp.getComment", "wp.getComments", "wp.deleteComment", "wp.editComment", "wp.newComment", "wp.getCommentStatusList", "wp.getMediaItem", "wp.getMediaLibrary", "wp.getPostFormats", "wp.getPostType", "wp.getPostTypes", "wp.getRevisions", "wp.restoreRevision", "blogger.getUsersBlogs", "blogger.getUserInfo", "blogger.getPost", "blogger.getRecentPosts", "blogger.newPost", "blogger.editPost", "blogger.deletePost", "metaWeblog.newPost", "metaWeblog.editPost", "metaWeblog.getPost", "metaWeblog.getRecentPosts", "metaWeblog.getCategories", "metaWeblog.newMediaObject", "metaWeblog.deletePost", "metaWeblog.getUsersBlogs", "mt.getCategoryList", "mt.getRecentPostTitles", "mt.getPostCategories", "mt.setPostCategories", "mt.supportedMethods", "mt.supportedTextFilters", "mt.getTrackbackPings", "mt.publishPost", "pingback.ping", "pingback.extensions.getPingbacks", "demo.sayHello", "demo.addTwoNumbers"} on callXMLRPC(paramURL, aMethod, aParamList) set aURL to current application’s |NSURL|’s URLWithString:paramURL set aReq to current application’s NSMutableURLRequest’s alloc()’s initWithURL:aURL aReq’s setHTTPMethod:"POST" set encoder to current application’s WPXMLRPCEncoder’s alloc()’s initWithMethod:aMethod andParameters:aParamList (aReq’s setHTTPBody:(encoder’s dataEncodedWithError:(missing value))) set aRes to current application’s NSURLConnection’s sendSynchronousRequest:aReq returningResponse:(reference) |error|:(missing value) set resList to aRes as list set bRes to contents of (first item of resList) set cRes to second item of resList (* (NSHTTPURLResponse) <NSHTTPURLResponse: 0x6000000289a0> { URL: http://piyocast.com/as/xmlrpc.php } { status code: 200, headers { Connection = close; "Content-Type" = "text/xml; charset=UTF-8"; Date = "Wed, 07 Feb 2018 16:10:49 GMT"; Server = Apache; "Transfer-Encoding" = Identity; } } *) set decoder to current application’s WPXMLRPCDecoder’s alloc()’s initWithData:bRes set errF to (decoder’s isFault()) as boolean if errF = true then —Error set xmlRPCres to faultCode of resStr set xmlRPCbody to faultString of resStr return false else –Success? set xmlRPCres to (decoder’s object()) as list of string or string –Error if xmlRPCres = missing value then return false end if return xmlRPCres end callXMLRPC |