Keynote書類上のテキストアイテムを、内容の文字の実際の幅でリサイズするAppleScriptです。
▲テキストアイテム中のテキストをコピー(Command-C)
▲リサイズ前のテキストアイテム。文字に対してフレームサイズが大きい
▲本Scriptによりリサイズした後のテキストアイテム。文字の内容に対してフレームサイズがフィットしている
▲本Scriptにより順次複数のテキストアイテムを文字幅にリサイズしたところ。selectionがまともに動作していれば、複数のテキストアイテムを選択した状態でScriptを走らせて一度にリサイズできる(はず)だが、selectionが動作していないので複数のオブジェクトに対して同じ回数の操作が必要
Keynoteにはversion 9.0で「selection」の予約語が追加されましたが、これは一般に期待されるような「表示中のスライド上で選択中のオブジェクトへの参照が取得できる」というものではありません。
つまり、選択中のオブジェクトへの参照をKeynoteに対して問い合わせることは、(現時点では)不可能です。
そこで、テキストアイテム内の内容(object text)をコピー(Command-C)してクリップボードに格納し、その内容をキーにして現在表示中のスライド内のテキストアイテムを抽出してみたところ、うまくいきました(なんでこんなことさせられてるんだろ?)。早くselectionがKeynote上でもまともに使えるようになってほしいものです(Pages上ではけっこういい感じに使えるのに)。
テキストアイテムの特定ができるようになったので、入っているobject textのサイズに合わせてテキストアイテムをリサイズする処理を書いてみました。
クリップボードの内容をNSAttributedStringとして取得し、その画面上の描画サイズを取得するサブルーチンは毎日さんざん使っているので(掲載リストのproperty宣言部をソートするのに使っています)信頼性があります。
とりあえず、擬似的に現在選択中のオブジェクトを特定する実験コードにちょっとだけ機能をつけたものですが、操作1に対して結果1というのは普通「自動化」とか言わないので、実用性は皆無です(めんどくさい操作ステップを省けるぐらいしか)。
AppleScript名:Keynoteのテキストアイテム内の文字の実際の幅でリサイズ |
— – Created by: Takaaki Naganoya – Created on: 2019/04/05 — – Copyright © 2019 Piyomaru Software, All Rights Reserved — use AppleScript version "2.5" use scripting additions use framework "Foundation" use framework "AppKit" use BPlus : script "BridgePlus" –https://www.macosxautomation.com/applescript/apps/BridgePlus.html property NSFont : a reference to current application’s NSFont property NSColor : a reference to current application’s NSColor property NSPasteboard : a reference to current application’s NSPasteboard property NSAttributedString : a reference to current application’s NSAttributedString property NSFontAttributeName : a reference to current application’s NSFontAttributeName property NSMutableAttributedString : a reference to current application’s NSMutableAttributedString property NSForegroundColorAttributeName : a reference to current application’s NSForegroundColorAttributeName load framework –クリップボードの内容をテキストとして取得し、現在のKeynote書類中のtext itemのうちコピーしたテキストに該当するものを抽出 set targString to (the clipboard) as string tell application "Keynote" tell document 1 tell current slide set tList to every text item whose object text is targString if tList = {} then return set targObject to first item of tList end tell end tell end tell –クリップボードの内容をNSAttributedStringに set anAttr to my getClipboardASStyledText() –Split Attributed Strings into lines set attrList to splitAttributedStringByLines(anAttr) of me –Sort Attributed String list by its width in descending (large–> small) set aResList to shellSortListDecending(attrList, 1) of me set {targObjWidth, targAttrStrObj} to first item of aResList –Resize Text item objet’s frame by its drawing width on screen tell application "Keynote" tell document 1 tell current slide tell targObject set width to ((targObjWidth as number) + 10) –resize it ! end tell end tell end tell end tell –入れ子のリストを昇順ソート on shellSortListAscending(a, keyItem) return sort2DList(a, keyItem, {true}) of me end shellSortListAscending –入れ子のリストを降順ソート on shellSortListDecending(a, keyItem) return sort2DList(a, keyItem, {false}) of me end shellSortListDecending –2D Listをソート on sort2DList(aList as list, sortIndexes as list, sortOrders as list) –index値をAS流(アイテムが1はじまり)からCocoa流(アイテムが0はじまり)に変換 set newIndex to {} repeat with i in sortIndexes set j to contents of i set j to j – 1 set the end of newIndex to j end repeat –Sort TypeのListを作成(あえて外部から指定する内容でもない) set sortTypes to {} repeat (length of sortIndexes) times set the end of sortTypes to "compare:" end repeat –Sort set resList to (current application’s SMSForder’s subarraysIn:(aList) sortedByIndexes:newIndex ascending:sortOrders sortTypes:sortTypes |error|:(missing value)) as list return resList end sort2DList — クリップボードの内容をNSAttributedStringとして取り出して返す on getClipboardASStyledText() try set theNSPasteboard to NSPasteboard’s generalPasteboard() set theAttributedStringNSArray to theNSPasteboard’s readObjectsForClasses:({NSAttributedString}) options:(missing value) set theNSAttributedString to theAttributedStringNSArray’s objectAtIndex:0 return theNSAttributedString on error return missing value end try end getClipboardASStyledText on splitAttributedStringByLines(theStyledText) set outList to {} set outAttr to NSMutableAttributedString’s alloc()’s initWithString:"" set thePureString to theStyledText’s |string|() –pure string from theStyledText set theLength to theStyledText’s |length|() set startIndex to 0 repeat until (startIndex = theLength) set {theAtts, theRange} to theStyledText’s attributesAtIndex:startIndex longestEffectiveRange:(reference) inRange:{startIndex, theLength – startIndex} set aText to (thePureString’s substringWithRange:theRange) as string –String set aColor to (theAtts’s valueForKeyPath:"NSColor") –Color set aFont to (theAtts’s valueForKeyPath:"NSFont") –Font if aFont is equal to missing value then error "Not font name and size are specified" –Font Name error set aDFontName to aFont’s displayName() –Font Name set aDFontSize to aFont’s pointSize() –Font Size set tmpAttrStr to generateAttributedString(aText, aDFontName, aDFontSize, aColor) of me outAttr’s appendAttributedString:tmpAttrStr if (aText contains return) or (aText contains string id 10) then –CR or LF set tmpSize to outAttr’s |size|() set tmpWidth to retWidthFromSize(tmpSize) of me set the end of outList to {tmpWidth, outAttr} set outAttr to NSMutableAttributedString’s alloc()’s initWithString:"" end if set startIndex to current application’s NSMaxRange(theRange) end repeat set tmpSize to outAttr’s |size|() set tmpWidth to retWidthFromSize(tmpSize) of me set the end of outList to {tmpWidth, outAttr} return outList end splitAttributedStringByLines on retWidthFromSize(tmpSize) if class of tmpSize = record then –macOS 10.10, 10.11, 10.12 set tmpWidth to width of tmpSize else –macOS 10.13, 10.14 set tmpWidth to first item of tmpSize end if return tmpWidth end retWidthFromSize on generateAttributedString(aStr, aFontPSName, aFontSize, aColor) set tmpAttr to NSMutableAttributedString’s alloc()’s initWithString:aStr set aRange to current application’s NSMakeRange(0, tmpAttr’s |length|()) set aVal1 to NSFont’s fontWithName:aFontPSName |size|:aFontSize tmpAttr’s beginEditing() tmpAttr’s addAttribute:(NSFontAttributeName) value:aVal1 range:aRange tmpAttr’s addAttribute:(NSForegroundColorAttributeName) value:aColor range:aRange tmpAttr’s endEditing() return tmpAttr end generateAttributedString |