文字列の途中にアンダースコア(「_」)が入っていたら削除し、その次の文字列(たぶんアルファベット)を大文字化するAppleScriptです。
github上でたまに「あ、これいいかも」というObjective-Cで書かれたプログラムを見つけた場合に、Cocoa Frameworkとしてビルドして外部からAppleScriptから呼び出したくなります。
しかし、メソッド名にアンダースコア(「_」)が入っていて断念したことが、何回かあります。
AppleScript、とくにCocoaを呼び出すAppleScriptObjCの世界では、そうしたCocoa Framework中のメソッドにアンダースコアが入っていると、「|」でエスケープしても展開されて、パラメータがそこに入るものとして解釈されてしまいます。つまり、すべてのソースを書き換えなくてはならないわけです。
ここで、単純にアンダースコアを削除しただけでは可読性が落ちるので、アンダースコアの後にあった文字(おそらくアルファベット)を大文字化したいわけですが、なかなか手が混んでいて大変な処理です。
そこで、AppleScriptを書いて処理させるためのテストプログラムを作ってみました。1行分の処理はできているように見えます。
この種類のプログラムは、何回か組んだ記憶があるのですが、いつも大して役に立たずに立ち消えになっているような気が、、、、やっぱり、Xcode自体のAppleScript対応度が散々な出来で、やりたい処理ができずにどこかに消えてしまうから、なのかも、、、、
AppleScript名:アンダースコアが入っていたら削除して次の文字を大文字化.scpt |
— – Created by: Takaaki Naganoya – Created on: 2021/12/06 — – Copyright © 2021 Piyomaru Software, All Rights Reserved — use AppleScript version "2.4" use scripting additions use framework "Foundation" set a to "- (void)patch_splitMax_toMax:(NSMutableArray *)patches;" set aTarg to "_" set b to removeAcharAndCapitalize(a, aTarg) of me –> "- (void)patchSplitMaxToMax:(NSMutableArray *)patches;" on removeAcharAndCapitalize(aStr, aTargChar) if aStr contains aTargChar then set bList to countAcharInStrAndDetectPos(aStr, aTargChar) of me –1行に複数のアンダースコアが登場する場合に対処 copy bList to {countNum, itemList} set revList to reverse of itemList –後方から処理 repeat with i in revList –アイテム番号でループ(後方から処理) set a1Str to text 1 thru (i – 1) of aStr set bStr to text (i + 1) thru -1 of aStr set bStr2 to capitalizeHeadChar(bStr) of me set aStr to a1Str & bStr2 end repeat end if return aStr end removeAcharAndCapitalize –指定文字列の頭文字を大文字化 on capitalizeHeadChar(aStr) set a1Str to text 1 of aStr set a2Str to text 2 thru -1 of aStr set a1aStr to current application’s NSMutableString’s stringWithString:a1Str set a1bStr to (a1aStr’s uppercaseString()) as string return (a1bStr & a2Str) end capitalizeHeadChar –文字列中に指定文字が何個入っているかカウントし、登場位置をリストで返す on countAcharInStrAndDetectPos(aStr, aTargChar) set aList to {} set posC to 1 considering case set aHit to offset of aTargChar in aStr if aHit is not equal to 0 then set aaList to characters of aStr set aCount to 0 repeat with i in aaList set j to contents of i if j = aTargChar then set aCount to aCount + 1 set the end of aList to posC end if set posC to posC + 1 end repeat return {aCount, aList} else return {0, {}} end if end considering end countAcharInStrAndDetectPos |
More from my site
(Visited 54 times, 1 visits today)