最前面のテキストを塗り／線の色でそれぞれの指定数で交互に塗るAppleScript

先日、[最前面のテキストを塗り／線の色で1文字ずつ交互に塗るAppleScript][url1]を公開しましたが、その時から「2文字置きにしたい」という声は聞いていたのですが手段が思い浮かばなかったので一旦保留していました。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">乗り遅れた感あるけどJSでも作ってみました。サロゲートペアは2020でも正しく処理できませんので...使い方は線と塗りの色を設定してからテキストフレームを選択し実行です。2色+1色パターンとかcolor[]部分で調整できます。<a href="https://t.co/zL5rdFNx2S">https://t.co/zL5rdFNx2S</a> <a href="https://t.co/237E0MDavJ">pic.twitter.com/237E0MDavJ</a></p>&mdash; 古籏一浩 (@openspc) <a href="https://twitter.com/openspc/status/1283021112499027970?ref_src=twsrc%5Etfw">July 14, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
[古旗さん][tw1]が塗りのパターンを配列にするという手法を取ってらっしゃったのでそれを参考に、2色の塗りの文字数をそれぞれ設定できるように書いてみました。



## 使い方

![スクリーンショット 2020-07-13 23.33.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/7001/c1e37f38-2f74-3725-45b8-b7ce33762be5.png)前回同様、塗りの色が初めの文字色で線の色が後の方の文字色になります。  
**※選択しているレイヤーの最上位の文字が対象になります。**

```AppleScript
--初めの塗りの色数
set fillCount to 2
--あとの塗りの色数
set strokeCount to 1
```  

この部分で文字数を設定します。
![スクリーンショット 2020-07-28 3.25.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/7001/04af43a5-267a-c327-14ad-8631f9792399.png)
![スクリーンショット 2020-07-28 3.26.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/7001/22e2ede9-200c-70c3-09b4-faaf47ec3a46.png)

上記のように**fillColor**を**2**、**strokeColor**を**1**と設定した場合はこのようになります。
必要に応じて書き換えてください。

## コード

``` AppleScript
(*
    最前面のテキストに対し、塗り／線の色でそれぞれの指定数で交互に塗るスクリプト
    既知の問題：サロゲートペアがあると正しく処理できない
        
    2020-07-15	エラー処理追加／塗りのパターン追加

*)

----塗り分けの文字数の指定
--初めの塗りの文字数
set fillCount to 2
--あとの塗りの文字数
set strokeCount to 1

set _SPACE to ASCII character 32


tell application "Adobe Illustrator"
	activate
	
	my chkOpenDoc(count of document)
	
	tell document 1
		
		set {fillColor, strokeColor} to my getColor()
		set colorList to my getColorList(fillColor, strokeColor, fillCount, strokeCount)
		set colorCount to count of colorList
		
		set celectText to (current layer)'s every page item
		tell celectText's item 1
			
			set j to 1
			
			repeat with i from 1 to count of (contents as string)
				
				tell character i
					if contents is greater than _SPACE then
						set fill color to colorList's item j
						set j to j + 1
					end if
				end tell
				
				if j is greater than colorCount then
					set j to 1
				end if
				
			end repeat
		end tell
	end tell
end tell

on chkOpenDoc(i)
	tell application "Adobe Illustrator"
		if (i) is 0 then
			display dialog "ドキュメントが開かれていません" buttons {"OK"} default button "OK" with icon 0
			error number -128
		end if
	end tell
end chkOpenDoc

on getColor()
	
	tell application "Adobe Illustrator"
		tell document 1
			
			set fillColor to default fill color
			if fillColor's class is CMYK color info or class is RGB color info then
				
			else
				display dialog "塗り色が正しく設定されていません。" buttons {"OK"} default button "OK" with icon 0
				error number -128
			end if
			
			set strokeColor to default stroke color
			if strokeColor's class is CMYK color info or class is RGB color info then
				
			else
				display dialog "線の色が正しく設定されていません。" buttons {"OK"} default button "OK" with icon 0
				error number -128
			end if
			
			return {fillColor, strokeColor}
			
		end tell
	end tell
	
end getColor

on getColorList(fillColor, strokeColor, fillCount, strokeCount)
	tell application "Adobe Illustrator"
		tell document 1
			
			set colorList to {}
			
			repeat with i from 1 to fillCount
				set (colorList)'s end to fillColor
			end repeat
			
			repeat with i from 1 to strokeCount
				set (colorList)'s end to strokeColor
			end repeat
			
		end tell
		
		return colorList
		
	end tell
end getColorList

```



[url1]:[https://qiita.com/MD5500/items/668cfa58bc33083cb107]
[tw1]:[https://twitter.com/openspc/with_replies]