Keynote書類上で複数Shapeないしtext itemが選択された状態で、一番上にあるitemの幅に、下にあるitemを等分割+位置合わせを行うAppleScriptです。
言葉で言い表すと難しいのですが、画面キャプチャで表現すると一目瞭然です。
▲処理後、上側のshapeの幅で下のshapeを等分割+ギャップ指定
電子書籍作成時によく行う作業をワンアクションで行えるようにしてみました。
2D ListのソートはVanilla AppleScriptで書かれたものを使っていますが、これはソートする対象のデータが極小なのと、本ScriptをmacOS標準搭載のScript Menuから呼び出すために作ったためです。
2D Listのソートを行うためだけに、BridgePlusを使用=Script DebuggerでEnhanced Appletに書き出す必要があるというのは面倒なので。
AppleScript名:最前面のKeynote書類で選択中のshapeを一番上のガイドオブジェクトの幅をもとに、残りを等分割 |
— – Created by: Takaaki Naganoya – Created on: 2024/11/15 — – Copyright © 2024 Piyomaru Software, All Rights Reserved — use AppleScript version "2.4" — Yosemite (10.10) or later use framework "Foundation" use scripting additions property xGap : 8 –X軸方向のオブジェクトの隙間座標値 tell application "Keynote" tell front document set aSel to selection if aSel = {} then return set fClass to class of first item of aSel if fClass = slide then return –スライド上のオブジェクトではなく、スライドが選択されていた場合には処理しない set objList to {} set posList to {} set aCount to 1 repeat with i in aSel set j to contents of i set tmpClass to class of j –条件に合うオブジェクトのみ処理対象に if tmpClass is in {text item, shape} then set the end of objList to j set the end of posList to ((position of j) & (width of j) & aCount) set aCount to aCount + 1 end if end repeat set newPosList to shellSortListAscending(posList, 2) of sortLib –Y軸値をもとにソート set guideObj to first item of newPosList –Y軸座標が一番少ない(上)のものをガイドオブジェクトとしてみなす set newPosList to shellSortListAscending(rest of newPosList, 1) of sortLib –ガイドオブジェクト以外のオブジェクト座標値をX軸値でソート set guideWidth to contents of item 3 of guideObj set xStartPos to item 1 of item 1 of newPosList set yPos to item 2 of item 1 of newPosList set itemsCount to length of newPosList set itemWidth to (guideWidth – (xGap * (itemsCount – 1))) / itemsCount –下側オブジェクトの位置と幅修正処理 copy xStartPos to x repeat with i from 1 to itemsCount set y to item 2 of (item i of newPosList) set targObj to item (item 4 of (item i of newPosList)) of objList tell targObj set position of it to {x, y} set width of it to itemWidth end tell set x to x + itemWidth + (xGap) end repeat end tell end tell –Vanilla AppleScriptで書いた2D ListのSorting Lib script sortLib –シェルソートで入れ子のリストを昇順ソート on shellSortListAscending(aSortList, aKeyItem) script oBj property list : aSortList end script set len to count oBj’s list’s items set gap to 1 repeat while (gap ≤ len) set gap to ((gap * 3) + 1) end repeat repeat while (gap > 0) set gap to (gap div 3) if (gap < len) then repeat with i from gap to (len – 1) set temp to oBj’s list’s item (i + 1) set j to i repeat while ((j ≥ gap) and (contents of item aKeyItem of (oBj’s list’s item (j – gap + 1)) > item aKeyItem of temp)) set oBj’s list’s item (j + 1) to oBj’s list’s item (j – gap + 1) set j to j – gap end repeat set oBj’s list’s item (j + 1) to temp end repeat end if end repeat return oBj’s list end shellSortListAscending –シェルソートで入れ子のリストを降順ソート on shellSortListDescending(aSortList, aKeyItem) script oBj property list : aSortList end script set len to count oBj’s list’s items set gap to 1 repeat while (gap ≤ len) set gap to ((gap * 3) + 1) end repeat repeat while (gap > 0) set gap to (gap div 3) if (gap < len) then repeat with i from gap to (len – 1) set temp to oBj’s list’s item (i + 1) set j to i repeat while ((j ≥ gap) and (contents of item aKeyItem of (oBj’s list’s item (j – gap + 1)) < item aKeyItem of temp)) set oBj’s list’s item (j + 1) to oBj’s list’s item (j – gap + 1) set j to j – gap end repeat set oBj’s list’s item (j + 1) to temp end repeat end if end repeat return oBj’s list end shellSortListDescending end script |