Menu

Skip to content
AppleScriptの穴
  • Home
  • Products
  • Books
  • Docs
  • Events
  • Forum
  • About This Blog
  • License
  • 仕事依頼

AppleScriptの穴

Useful & Practical AppleScript archive. Click '★Click Here to Open This Script' Link to download each AppleScript

月: 2019年1月

Closure?

Posted on 1月 4, 2019 by Takaaki Naganoya

AppleScriptにClosureがない云々という話を見かけることがあります。JavaScript系の人が言っているのをよく見かけます。

ハンドラ内にさらに入れ子状にハンドラを宣言してプライベートなハンドラとして利用するのがclosureである、という説明を見かけました。

そういうものであれば、明確に存在します。Script文で記述するScript Objectです。

ハンドラ内に記述したScript文でScript Objectの宣言を行い、ハンドラ内でプライベートなサブハンドラを列挙することもできますし、外部に記述して論理分割することもできます。

実際に、巨大なScript同士を(何も考えずに)つないで使うような場合に重宝しています。

プライベートなハンドラをハンドラ内に入れ子状に作成したScript(本サンプルScriptのようなもの)については、たしかにinnerFunc1やinnerFunc2はメイン側(一番外側)からは直接呼び出すことはできないので、プライベートな関数のような扱いを行えます。便利かもしれないし、それほどでもない感じもします。

このあたりは個人の「趣味」の世界なので、そういう構造にしたい人はすればいいし、したくない人はしなければよいのではないでしょうか。

AppleScript名:closure1
set a to mainHander("ABC") of me
–> "ABCABC….ABCABC"

on mainHander(aParameter)
  script aClosure
    
    
on innerFunc1(aParameter)
      set a to aParameter & aParameter
      
return a
    end innerFunc1
    
    
on innerFunc2(aParameter)
      set a to aParameter & "…." & aParameter
      
return a
    end innerFunc2
    
  end script
  
  
set a to innerFunc1(aParameter) of aClosure
  
set b to innerFunc2(a) of aClosure
  
return b
end mainHander

★Click Here to Open This Script 

Cocoaの機能を利用するAppleScriptObjCの宣言を行った場合でも、同様にハンドラ内のScript Object内にさらにプライベートハンドラを記述する記法はコンパイル(=構文確認)を通るようです。

AppleScript名:closure2
—
–  Created by: Takaaki Naganoya
–  Created on: 2019/01/04
—
–  Copyright © 2019 Piyomaru Software, All Rights Reserved
—

use AppleScript version "2.4" — Yosemite (10.10) or later
use framework "Foundation"
use scripting additions

set a to mainHander("ABC") of me
–> "ABCABC….ABCABC"

on mainHander(aParameter)
  script aClosure
    
    
on innerFunc1(aParameter)
      set a to aParameter & aParameter
      
return a
    end innerFunc1
    
    
on innerFunc2(aParameter)
      set a to aParameter & "…." & aParameter
      
return a
    end innerFunc2
    
  end script
  
  
set a to innerFunc1(aParameter) of aClosure
  
set b to innerFunc2(a) of aClosure
  
return b
end mainHander

★Click Here to Open This Script 

Posted in How To JavaScript | Tagged 10.11savvy 10.12savvy 10.13savvy 10.14savvy | 1 Comment

指定の1D Listの要素数がaMaxLenに満たない場合には、1D Listの末尾のアイテムでaMaxLenまで埋める

Posted on 1月 3, 2019 by Takaaki Naganoya

指定の1D List(Array)の要素数が指定数に満たない場合には、List末尾のアイテムで指定要素数まで埋めるAppleScriptです。

{"1", "2", "3", "4", "5"}

のようなListがあって、最大数を10と指定してあった場合には、

{"1", "2", "3", "4", "5", "5", "5", "5", "5", "5"}

のように処理します。

AppleScript名:指定の1D Listの要素数がaMaxLenに満たない場合には、1D Listの末尾のアイテムでaMaxLenまで埋める
— Created 2019-01-03 by Takaaki Naganoya
— 2019 Piyomaru Software
use AppleScript version "2.4"
use scripting additions
use framework "Foundation"

set aList to {"11111", "22222", "33333", "44444", "55555"}
set aaList to fillByLastItemToMaxItems(aList, 6) of me
–> {"11111", "22222", "33333", "44444", "55555", "55555"}

–指定の1D Listの要素数がaMaxLenに満たない場合には、1D Listの末尾のアイテムでaMaxLenまで埋める
on fillByLastItemToMaxItems(aList as list, aMaxLen as integer)
  set aLen to length of aList
  
if aLen is not equal to aMaxLen then
    set anItem to contents of last item of aList
    
repeat aMaxLen – aLen times
      set the end of aList to anItem
    end repeat
  end if
  
  
return aList
end fillByLastItemToMaxItems

★Click Here to Open This Script 

Posted in list | Tagged 10.11savvy 10.12savvy 10.13savvy 10.14savvy | Leave a comment

指定の1D Listでゼロが入っていたら末尾のゼロの前の要素で埋める

Posted on 1月 3, 2019 by Takaaki Naganoya

指定の1D List(Array)でゼロが入っていたら、末尾のゼロの前の要素で埋めるAppleScriptです。

{"1", "2", "3", "4", "0", "0"}

のようなリストがあった場合に、

{"1", "2", "3", "4", "4", "4"}

のような処理を行います。

AppleScript名:指定の1D Listでゼロが入っていたら末尾のゼロの前の要素で埋める
— Created 2019-01-03 by Takaaki Naganoya
— 2019 Piyomaru Software
use AppleScript version "2.4"
use scripting additions
use framework "Foundation"

set aList to {"11111", "22222", "33333", "44444", "0", "0"}
set abList to fillByLastItemIfZero(aList)
–> {"11111", "22222", "33333", "44444", "44444", "44444"}

–指定の1D Listでゼロが入っていたらゼロの前の要素で埋める
on fillByLastItemIfZero(aList as list)
  set aLen to length of aList
  
set bList to {}
  
set prevDat to -1
  
  
set aFirst to (contents of first item of aList) as string
  
if aFirst = "0" then error "First Item is 0 in a list"
  
  
repeat with i in aList
    set aTmp to i as string
    
    
if aTmp = "0" then
      copy prevDat to aTmp
    else
      copy aTmp to prevDat
    end if
    
    
set the end of bList to aTmp
  end repeat
  
  
return bList
end fillByLastItemIfZero

★Click Here to Open This Script 

Posted in list | Tagged 10.11savvy 10.12savvy 10.13savvy 10.14savvy | Leave a comment

1D Listのうち指定文字種(複数指定可)で構成される要素のみ抽出 v2

Posted on 1月 1, 2019 by Takaaki Naganoya

1D List(配列)に入れた文字要素を文字種類で該当するものだけ抽出するAppleScriptの改良版です。

プログラムを見ていただくとわかるとおり、

 数字:”9″
 英字:”A”
 半角記号:”$”
 ひらがな:”ひ”
 カタカナ:”カ”
 漢字:”漢”

で文字種類を指定します。

ルーチンは2種類用意しており、

filterByMultipleCharKindStrictly:文字種別を判定して指定文字種のみから構成されるものを抽出(厳密に文字種別を遵守)
filterByMultipleCharKind:文字種別を判定して指定文字種のみから構成されるものを抽出

前者は複数の文字種リストを指定したら、その文字種リストと等しいパターンの文字列だけを抽出します。
後者は複数の文字種リストを指定したら、その文字種のうちどれかだけで構成される文字列だけを抽出します。

 {"Naganoya", "ながのや", "ナガノヤ", "長野谷", "ぴよまるソフトウェア", "ぴよまるSoftware", "Piyomaru12345", "123456789", "ぴよまる1234"} 

  
という文字列を与え、

{"ひ", "カ"}--Hiragana, Katakana

  
という抽出パターンを指定すると、

filterByMultipleCharKindStrictly --> {"ぴよまるソフトウェア"}
filterByMultipleCharKind --> {"ながのや", "ナガノヤ"}

  
のように抽出します。

スピードを考えなければ、機能は実用レベルにあると思われます。

高速化する場合には、

(1)Cocoaの機能を一切使わない(小さいデータを小分けにしてCocoaの機能を呼び出しているので、Cocoaの機能を使って高速化するのに最悪の処理パターンになっている。データ量のわりに時間がかかる。むしろCocoaの機能を使わない方が高速)

(2)Cocoaで一括処理できるように検討する(NSPredicatesで文字種別を同時に指定して抽出するなど)

といったところでしょうか。長い割にはそんなによくないプログラムですね。機能すること以外に取り柄がないというか、、、

AppleScript名:1D Listのうち指定文字種(複数指定可)で構成される要素のみ抽出 v2
—
–  Created by: Takaaki Naganoya
–  Created on: 2019/01/01
—
–  Copyright © 2019 Piyomaru Software, All Rights Reserved
—
use AppleScript version "2.4"
use scripting additions
use framework "Foundation"

property NSArray : a reference to current application’s NSArray
property NSString : a reference to current application’s NSString
property NSScanner : a reference to current application’s NSScanner
property NSNumber : a reference to current application’s NSNumber
property NSDictionary : a reference to current application’s NSDictionary
property NSOrderedSet : a reference to current application’s NSOrderedSet
property NSCountedSet : a reference to current application’s NSCountedSet
property NSCharacterSet : a reference to current application’s NSCharacterSet
property NSMutableArray : a reference to current application’s NSMutableArray
property NSSortDescriptor : a reference to current application’s NSSortDescriptor
property NSNumberFormatter : a reference to current application’s NSNumberFormatter
property NSMutableCharacterSet : a reference to current application’s NSMutableCharacterSet
property NSRegularExpressionSearch : a reference to current application’s NSRegularExpressionSearch
property NSNumberFormatterRoundUp : a reference to current application’s NSNumberFormatterRoundUp
property NSStringTransformFullwidthToHalfwidth : a reference to current application’s NSStringTransformFullwidthToHalfwidth

set aList to {"Naganoya", "ながのや", "ナガノヤ", "長野谷", "ぴよまるソフトウェア", "ぴよまるSoftware", "Piyomaru12345", "123456789", "ぴよまる1234"} –Alphabet, Hiragana, Katakana, Kanji, Hiragana+Katakana, Hiragana + Alphabet, Alphabet + Numeric, Numeric

set aRes to filterByMultipleCharKind(aList, {"A"}) of me –アルファベットで構成される要素のみ抽出
–> {"Naganoya"}

set bRes to filterByMultipleCharKind(aList, {"ひ"}) of me –ひらがなだけで構成される要素のみ抽出
–> {"ながのや"}

set cRes to filterByMultipleCharKind(aList, {"カ"}) of me –カタカナだけで構成される要素のみ抽出
–> {"ナガノヤ"}

set dRes to filterByMultipleCharKind(aList, {"漢"}) of me –漢字だけで構成される要素のみ抽出
–> {"長野谷"}

set eRes1 to filterByMultipleCharKindStrictly(aList, {"ひ", "カ"}) of me –ひらがな+カタカナで構成される要素のみ抽出
–> {"ぴよまるソフトウェア"}

set eRes2 to filterByMultipleCharKind(aList, {"ひ", "カ"}) of me –ひらがな or カタカナ だけで構成される要素のみ抽出
–> {"ながのや", "ナガノヤ"}

set fRes1 to filterByMultipleCharKindStrictly(aList, {"A", "9"}) of me –Alphabet + Numericだけで構成される要素のみ抽出
–> {"Piyomaru12345"}

set fRes2 to filterByMultipleCharKind(aList, {"A", "9"}) of me –Alphabet or Numericだけで構成される要素のみ抽出
–> {"Naganoya", "123456789"}

set gRes1 to filterByMultipleCharKindStrictly(aList, {"ひ", "9"}) of me –Hiragana + Numericだけで構成される要素のみ抽出
–> {"ぴよまる1234"}

–文字種別を判定して指定文字種のみから構成されるものを抽出(厳密に文字種別を遵守)
on filterByMultipleCharKindStrictly(aList as list, targCharKindList as list)
  set dList to {}
  
set paramList to sort1DStringList(targCharKindList, true) of me
  
  
repeat with i in aList
    set j to contents of i
    
set tmpPat to retAtrPatternFromStr(j) of me
    
if tmpPat is equal to paramList then
      set the end of dList to j
    end if
  end repeat
  
  
return dList
end filterByMultipleCharKindStrictly

–文字種別を判定して指定文字種のみから構成されるものを抽出
on filterByMultipleCharKind(aList as list, targCharKindList as list)
  set dList to {}
  
  
repeat with i in aList
    set j to contents of i
    
set tmpPat to retAtrPatternFromStr(j) of me
    
if tmpPat is in targCharKindList then
      set the end of dList to j
    end if
  end repeat
  
  
return dList
end filterByMultipleCharKind

–Objective-Cライクなパラメータ記述
on makeUniqueListOf:theList
  set theSet to NSOrderedSet’s orderedSetWithArray:theList
  
return (theSet’s array()) as list
end makeUniqueListOf:

–Pure AS風のパラメータ記述
on makeUniqueListFrom(theList)
  set aList to my makeUniqueListOf:theList
  
return aList
end makeUniqueListFrom

–1D Listを文字列長でソート v2
on sort1DListByStringLength(aList as list, sortOrder as boolean)
  set aArray to NSArray’s arrayWithArray:aList
  
set desc1 to NSSortDescriptor’s sortDescriptorWithKey:"length" ascending:sortOrder
  
set desc2 to NSSortDescriptor’s sortDescriptorWithKey:"self" ascending:true selector:"localizedCaseInsensitiveCompare:"
  
set bArray to aArray’s sortedArrayUsingDescriptors:{desc1, desc2}
  
return bArray as list of string or string
end sort1DListByStringLength

–1D List(文字)をsort / ascOrderがtrueだと昇順ソート、falseだと降順ソート
on sort1DStringList(theList as list, aBool as boolean)
  set aDdesc to NSSortDescriptor’s sortDescriptorWithKey:"self" ascending:aBool selector:"localizedCaseInsensitiveCompare:"
  
set theArray to NSArray’s arrayWithArray:theList
  
return (theArray’s sortedArrayUsingDescriptors:{aDdesc}) as list
end sort1DStringList

–文字種別の判定
on retAtrPatternFromStr(aText as string)
  set b1List to {"9", "A", "$", "漢", "ひ", "カ"} –数字、アルファベット、記号、全角漢字、全角ひらがな、全角カタカナ
  
  
set outList to {}
  
set cList to characters of (aText)
  
  
repeat with i in cList
    set j to contents of i
    
    
set chk1 to ((my chkNumeric:j) as integer) * 1
    
set chk2 to ((my chkAlphabet:j) as integer) * 2
    
set chk3 to ((my chkSymbol:j) as integer) * 3
    
set chk4 to ((my chkKanji:j) as integer) * 4
    
set chk5 to ((my chkHiragana:j) as integer) * 5
    
set chk6 to ((my chkKatakana:j) as integer) * 6
    
    
set itemVal to (chk1 + chk2 + chk3 + chk4 + chk5 + chk6)
    
    
–if itemVal > 0 then
    
set aVal to (contents of item itemVal of b1List)
    
    
if aVal is not in outList then
      set the end of outList to aVal
    end if
    
–end if
  end repeat
  
  
set out2List to sort1DStringList(outList, true) of me
  
  
return out2List
end retAtrPatternFromStr

–全角→半角変換
on zenToHan(aStr)
  set aString to NSString’s stringWithString:aStr
  
return (aString’s stringByApplyingTransform:(NSStringTransformFullwidthToHalfwidth) |reverse|:false) as string
end zenToHan

–数字か
on chkNumeric:checkString
  set digitCharSet to NSCharacterSet’s characterSetWithCharactersInString:"0123456789"
  
set ret to my chkCompareString:checkString baseString:digitCharSet
  
return ret as boolean
end chkNumeric:

–記号か
on chkSymbol:checkString
  set muCharSet to NSCharacterSet’s alloc()’s init()
  
muCharSet’s addCharactersInString:"$\"!~&=#[]._-+`|{}?%^*/’@-/:;(),"
  
set ret to my chkCompareString:checkString baseString:muCharSet
  
return ret as boolean
end chkSymbol:

–漢字か
on chkKanji:aChar
  return detectCharKind(aChar, "[一-龠]") of me
end chkKanji:

–ひらがなか
on chkHiragana:aChar
  return detectCharKind(aChar, "[ぁ-ん]") of me
end chkHiragana:

–カタカナか
on chkKatakana:aChar
  return detectCharKind(aChar, "[ァ-ヶ]") of me
end chkKatakana:

–半角スペースか
on chkSpace:checkString
  set muCharSet to NSCharacterSet’s alloc()’s init()
  
muCharSet’s addCharactersInString:" " –半角スペース(20h)
  
set ret to my chkCompareString:checkString baseString:muCharSet
  
return ret as boolean
end chkSpace:

— アルファベットか
on chkAlphabet:checkString
  set aStr to NSString’s stringWithString:checkString
  
set allCharSet to NSMutableCharacterSet’s alloc()’s init()
  
allCharSet’s addCharactersInRange:({location:97, |length|:26}) –97 = id of "a"
  
allCharSet’s addCharactersInRange:({location:65, |length|:26}) –65 = id of "A"
  
set aBool to my chkCompareString:aStr baseString:allCharSet
  
return aBool as boolean
end chkAlphabet:

on chkCompareString:checkString baseString:baseString
  set aScanner to NSScanner’s localizedScannerWithString:checkString
  
aScanner’s setCharactersToBeSkipped:(missing value)
  
aScanner’s scanCharactersFromSet:baseString intoString:(missing value)
  
return (aScanner’s isAtEnd()) as boolean
end chkCompareString:baseString:

on detectCharKind(aChar, aPattern)
  set aChar to NSString’s stringWithString:aChar
  
set searchStr to NSString’s stringWithString:aPattern
  
set matchRes to aChar’s rangeOfString:searchStr options:(NSRegularExpressionSearch)
  
if matchRes’s location() = (current application’s NSNotFound) or (matchRes’s location() as number) > 9.99999999E+8 then
    return false
  else
    return true
  end if
end detectCharKind

★Click Here to Open This Script 

Posted in list Text | Tagged 10.11savvy 10.12savvy | Leave a comment

Post navigation

  • Newer posts

電子書籍(PDF)をオンラインストアで販売中!

Google Search

Popular posts

  • macOS 13, Ventura(継続更新)
  • アラートダイアログ上にWebViewで3Dコンテンツを表示(WebGL+three.js)v3
  • UI Browserがgithub上でソース公開され、オープンソースに
  • macOS 13 TTS Voice環境に変更
  • Xcode 14.2でAppleScript App Templateを復活させる
  • 2022年に書いた価値あるAppleScript
  • ChatGPTで文章のベクトル化(Embedding)
  • 新発売:AppleScriptからSiriを呼び出そう!
  • iWork 12.2がリリースされた
  • 従来と異なるmacOS 13の性格?
  • 新発売:CotEditor Scripting Book with AppleScript
  • macOS 13対応アップデート:AppleScript実践的テクニック集(1)GUI Scripting
  • AS関連データの取り扱いを容易にする(はずの)privateDataTypeLib
  • macOS 13でNSNotFoundバグふたたび
  • macOS 12.5.1、11.6.8でFinderのselectionでスクリーンショット画像をopenできない問題
  • ChatGPTでchatに対する応答文を取得
  • 新発売:iWork Scripting Book with AppleScript
  • Finderの隠し命令openVirtualLocationが発見される
  • macOS 13.1アップデートでスクリプトエディタの挙動がようやくまともに
  • あのコン過去ログビューワー(暫定版)

Tags

10.11savvy (1101) 10.12savvy (1242) 10.13savvy (1390) 10.14savvy (586) 10.15savvy (434) 11.0savvy (277) 12.0savvy (185) 13.0savvy (55) CotEditor (60) Finder (47) iTunes (19) Keynote (98) NSAlert (60) NSArray (51) NSBezierPath (18) NSBitmapImageRep (20) NSBundle (20) NSButton (34) NSColor (51) NSDictionary (27) NSFileManager (23) NSFont (18) NSImage (41) NSJSONSerialization (21) NSMutableArray (62) NSMutableDictionary (21) NSPredicate (36) NSRunningApplication (56) NSScreen (30) NSScrollView (22) NSString (117) NSURL (97) NSURLRequest (23) NSUTF8StringEncoding (30) NSView (33) NSWorkspace (20) Numbers (56) Pages (37) Safari (41) Script Editor (20) WKUserContentController (21) WKUserScript (20) WKUserScriptInjectionTimeAtDocumentEnd (18) WKWebView (23) WKWebViewConfiguration (22)

カテゴリー

  • 2D Bin Packing
  • 3D
  • AirDrop
  • AirPlay
  • Animation
  • AppleScript Application on Xcode
  • beta
  • Bluetooth
  • Books
  • boolean
  • bounds
  • Bug
  • Calendar
  • call by reference
  • Clipboard
  • Code Sign
  • Color
  • Custom Class
  • dialog
  • drive
  • exif
  • file
  • File path
  • filter
  • folder
  • Font
  • Font
  • GAME
  • geolocation
  • GUI
  • GUI Scripting
  • Hex
  • History
  • How To
  • iCloud
  • Icon
  • Image
  • Input Method
  • Internet
  • iOS App
  • JavaScript
  • JSON
  • JXA
  • Keychain
  • Keychain
  • Language
  • Library
  • list
  • Locale
  • Machine Learning
  • Map
  • Markdown
  • Menu
  • Metadata
  • MIDI
  • MIME
  • Natural Language Processing
  • Network
  • news
  • Noification
  • Notarization
  • Number
  • Object control
  • OCR
  • OSA
  • PDF
  • Peripheral
  • PRODUCTS
  • QR Code
  • Raw AppleEvent Code
  • Record
  • rectangle
  • recursive call
  • regexp
  • Release
  • Remote Control
  • Require Control-Command-R to run
  • REST API
  • Review
  • RTF
  • Sandbox
  • Screen Saver
  • Script Libraries
  • sdef
  • search
  • Security
  • selection
  • shell script
  • Shortcuts Workflow
  • Sort
  • Sound
  • Spellchecker
  • Spotlight
  • SVG
  • System
  • Tag
  • Telephony
  • Text
  • Text to Speech
  • timezone
  • Tools
  • Update
  • URL
  • UTI
  • Web Contents Control
  • WiFi
  • XML
  • XML-RPC
  • イベント(Event)
  • 未分類

アーカイブ

  • 2023年9月
  • 2023年8月
  • 2023年7月
  • 2023年6月
  • 2023年5月
  • 2023年4月
  • 2023年3月
  • 2023年2月
  • 2023年1月
  • 2022年12月
  • 2022年11月
  • 2022年10月
  • 2022年9月
  • 2022年8月
  • 2022年7月
  • 2022年6月
  • 2022年5月
  • 2022年4月
  • 2022年3月
  • 2022年2月
  • 2022年1月
  • 2021年12月
  • 2021年11月
  • 2021年10月
  • 2021年9月
  • 2021年8月
  • 2021年7月
  • 2021年6月
  • 2021年5月
  • 2021年4月
  • 2021年3月
  • 2021年2月
  • 2021年1月
  • 2020年12月
  • 2020年11月
  • 2020年10月
  • 2020年9月
  • 2020年8月
  • 2020年7月
  • 2020年6月
  • 2020年5月
  • 2020年4月
  • 2020年3月
  • 2020年2月
  • 2020年1月
  • 2019年12月
  • 2019年11月
  • 2019年10月
  • 2019年9月
  • 2019年8月
  • 2019年7月
  • 2019年6月
  • 2019年5月
  • 2019年4月
  • 2019年3月
  • 2019年2月
  • 2019年1月
  • 2018年12月
  • 2018年11月
  • 2018年10月
  • 2018年9月
  • 2018年8月
  • 2018年7月
  • 2018年6月
  • 2018年5月
  • 2018年4月
  • 2018年3月
  • 2018年2月

https://piyomarusoft.booth.pm/items/301502

メタ情報

  • ログイン
  • 投稿フィード
  • コメントフィード
  • WordPress.org

Forum Posts

  • 人気のトピック
  • 返信がないトピック

メタ情報

  • ログイン
  • 投稿フィード
  • コメントフィード
  • WordPress.org
Proudly powered by WordPress
Theme: Flint by Star Verte LLC