| AppleScript名:LAN上のファイルサーバー(afp)のホスト名を取得する |
| — Created 2015-12-24 by Takaaki Naganoya — 2015 Piyomaru Software use AppleScript version "2.4" use scripting additions use framework "Foundation" property foundHosts : {} property myHostName : "" findHostsViaBonjour("_afpovertcp._tcp") of me –AFP’s port:548 –> {"MBA13", "Mini_2", "MBA11"} on findHostsViaBonjour(aType) set foundHosts to {} set myHostName to (current application’s NSHost’s currentHost()’s localizedName()) as string set aBrowser to current application’s NSNetServiceBrowser’s alloc()’s init() aBrowser’s setDelegate:me aBrowser’s searchForServicesOfType:aType inDomain:"" repeat 1000 times if foundHosts is not equal to {} then exit repeat delay 0.01 end repeat aBrowser’s setDelegate:(missing value) return foundHosts end findHostsViaBonjour on netServiceBrowser:aNetServiceBrowser didFindService:aNetService moreComing:aMoreComing set aDesc to aNetServiceBrowser’s |description|() set bDesc to aNetService’s |description|() set cDesc to (aNetService’s |name|()) as text if cDesc is not in foundHosts and cDesc is not equal to myHostName then set the end of foundHosts to cDesc end if end netServiceBrowser:didFindService:moreComing: |
カテゴリー: System
Notification
macOS 10.10より、標準のScripting環境(スクリプトエディタ)上でCocoa-bridgeが使えるようになったので、Cocoa系のevent(Notification)が使えるようになったことを利用したサンプルです。
AppleScriptは基本的に、アプリケーションの機能や設定値を呼び出すためのもので、ごく一部の限られたアプリケーション以外からは「アプリケーション側からAppleScript(の所定のハンドラ)を呼び出す」方向のイベント呼び出しは利用できませんでした。
しかし、Cocoaのnotificationが利用できるようになったことで、多彩なイベント受信が行えるようになりました。
iTunes(or Music.app)の再生曲変更のnotificationを受信してやたらとTwitterなどに流そうとする入門Scripterがいるのですが(どこかの伝統芸か何かなんだろうか?)、そこはそんなに楽しいとも思えないし、本来のパワーを発揮していないとは思うのですが、見かけたらそっと触れないようにしておくことにしています。
| AppleScript名:Notification |
| — 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 NSDistributedNotificationCenter : a reference to current application’s NSDistributedNotificationCenter on run NSDistributedNotificationCenter’s defaultCenter()’s addObserver:me selector:"statusChanged:" |name|:"com.apple.iTunes.playerInfo" object:(missing value) end run on statusChanged:sender tell application id "com.apple.iTunes" try tell current track set anAlbum to album set aName to name set anArtist to album artist set aRating to rating end tell on error return end try end tell display notification aName end statusChanged: |
指定Bundle IDのプロセス存在確認(ASOC)v3
| AppleScript名:指定Bundle IDのプロセス存在確認(ASOC)v3 |
| — Created 2015-02-08 by Takaaki Naganoya — Created 2017-02-26 by Takaaki Naganoya — 2017 Piyomaru Software use AppleScript version "2.4" use scripting additions use framework "Foundation" use framework "AppKit" set aRes to chkAppProcesByBundleID("com.apple.iWork.Keynote") –> true on chkAppProcesByBundleID(aBundleID as string) set procArray to current application’s NSWorkspace’s sharedWorkspace’s runningApplications()’s valueForKeyPath:"bundleIdentifier" return (procArray’s containsObject:aBundleID) as boolean end chkAppProcesByBundleID |
バンドルIDで指定したプロセスを強制終了(NSRunningApplication)
バンドルIDで指定したプロセスを強制終了させるAppleScriptです。
Finderを終了させてみると、あえて意図して起動しないとFinderが終了したままの状態で戻って来ません。
| AppleScript名:バンドルIDで指定したプロセスを強制終了(NSRunningApplication) |
| — Created 2017-09-17 by Takaaki Naganoya — 2017 Piyomaru Software use AppleScript version "2.4" use scripting additions use framework "Foundation" use framework "AppKit" set pRes to forceQuitAProcessByBUndleID("com.apple.finder") of me –指定プロセスの強制終了 on forceQuitAProcessByBUndleID(aBundleID) set appArray to current application’s NSRunningApplication’s runningApplicationsWithBundleIdentifier:aBundleID if appArray’s |count|() > 0 then set appItem to appArray’s objectAtIndex:0 set aRes to (appItem’s terminate()) as boolean return aRes else return false end if end forceQuitAProcessByBUndleID |
他のアプリケーションを隠す
| AppleScript名:他のアプリケーションを隠す |
| — Created 2017-01-07 by Takaaki Naganoya — 2017 Piyomaru Software use AppleScript version "2.4" use scripting additions use framework "Foundation" use framework "AppKit" current application’s NSWorkspace’s sharedWorkspace()’s hideOtherApplications() |
指定名称のアプリケーションプロセスが存在すればその正しい名前を返す
| 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 |
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 |
簡易形態素解析してスーパー大辞林で辞書検索
「words of」によるAppleScriptビルトインの超簡易形態素解析を実行して、日本語の文を単語(形態素)ごとに分解し、macOS標準搭載の辞書.appの「スーパー大辞林」で全単語を検索するAppleScriptです。
実行にあたっては、上記Frameworkを~/Library/Frameworksにインストールしたうえで、macOS 10.14以降ではScript Debuggerを用いるか、お使いのMacをSIP解除してScript Editor上で呼び出して実行する必要があります。
処理対象:”大きな栗の木の下で”
実行結果:
–> {{dictName:”スーパー大辞林”, keywordName:”で”, dictContents:”で 「て」の濁音の仮名。歯茎破裂音の有声子音と前舌の半狭母音とから成る音節。”}….}}
| AppleScript名:簡易形態素解析してスーパー大辞林で辞書検索 |
| — Created 2015-10-25 by Takaaki Naganoya — 2015 Piyomaru Software use AppleScript version "2.4" use scripting additions use framework "Foundation" use framework "dictKit" –https://github.com/mattt/DictionaryKit set aText to "大きな栗の木の下で" set wList to words of aText repeat with i in wList set dRes to getWordDifinitionInJapaneseDictionary(i as string) of me end repeat on getWordDifinitionInJapaneseDictionary(aTerm as string) set localNameList to getNameOfLocalDictionaries() of me set dNameList to {"スーパー大辞林"} set aSet to current application’s NSMutableSet’s setWithArray:localNameList set bSet to current application’s NSMutableSet’s setWithArray:dNameList aSet’s intersectSet:bSet set dList to aSet’s allObjects() as list if dList = {} then return false set aResList to {} repeat with i in dNameList set aDictionary to (current application’s TTTDictionary’s dictionaryNamed:i) set hitEntryList to (aDictionary’s entriesForSearchTerm:aTerm) as list if hitEntryList is not equal to {missing value} then repeat with ii in hitEntryList set j to contents of ii set headW to (j’s headword) set headW to headW as text try set aText to (j’s |text|) set aText to aText as text on error set aText to (j’s HTML) set aText to decodeCharacterReference(aText) of me end try set the end of aResList to {dictName:(i as text), keywordName:headW, dictContents:aText} end repeat end if end repeat aResList end getWordDifinitionInJapaneseDictionary on decodeCharacterReference(aStr) set anNSString to current application’s NSString’s stringWithString:aStr set theData to anNSString’s dataUsingEncoding:(current application’s NSUTF16StringEncoding) set styledString to current application’s NSAttributedString’s alloc()’s initWithHTML:theData documentAttributes:(missing value) set plainText to (styledString’s |string|()) as string return plainText end decodeCharacterReference on getNameOfLocalDictionaries() set dSet to current application’s TTTDictionary’s availableDictionaries() set dList to dSet’s allObjects() set dNameList to {} repeat with i in dList set the end of dNameList to (i’s |name|()) as text end repeat return dNameList end getNameOfLocalDictionaries |

