AppleScript名:横書きテキストを縦書きに変換 v6 |
— Created 2017-10-03 by Takaaki Naganoya — 2017 Piyomaru Software use AppleScript version "2.4" use scripting additions use framework "Foundation" –http://piyocast.com/as/archives/4875 property NSArray : a reference to current application’s NSArray property NSString : a reference to current application’s NSString property NSStringTransformFullwidthToHalfwidth : a reference to current application’s NSStringTransformFullwidthToHalfwidth property NSMutableArray : a reference to current application’s NSMutableArray on run set lineMax to 9 set aText to "テキスト縦書きを行うAppleScriptの「禁則処理」および任意改行への対応バージョンです。" set sRes to makeTategakiStr(lineMax, aText) of me end run –縦行数を指定しつつ指定テキストを縦書き化 on makeTategakiStr(lineMax as integer, aText as string) set curMax to 0 set sList to paragraphs of aText –途中で強制改行が入っているケースに対処 set aList to {} repeat with i in sList set outList to strToTategakiList(lineMax, i) of me set the end of aList to outList end repeat set aList to kinsokuList2(aList) of me set curLen to length of aList set curMax to getMaxItemCountFrom2DArray(aList) of me set tmpList to {} set twoDList to make2DBlankArray(curLen, curMax) of me set curY to 1 repeat with x from 1 to curMax set curX to 1 repeat with y from curLen to 1 by -1 set aCon to getItemByXY(x, y, aList, " ") of me set twoDList to setItemByXY(curX, curY, twoDList, aCon as string) of me set curX to curX + 1 end repeat set curY to curY + 1 end repeat — set twoDList2 to checkBlankVerticalLine(twoDList, " ") set aRes to list2dToStringByUsingDelimiters(twoDList2, " ", return) of me set zRes to hanToZen(aRes) of me return zRes end makeTategakiStr –与えた文字列を縦書き2Dリストに変換 on strToTategakiList(lineMax as integer, aText as string) set zText to hanToZen(aText) of me set outList to {} set oneLine to {} set aCount to 1 set curMax to 0 repeat with i from 1 to (length of aText) set aChar to character i of aText set aChar to retTateChar(aChar) of me set the end of oneLine to aChar set aCount to aCount + 1 if aCount > lineMax then set aCount to 1 set the end of outList to oneLine set oneLine to {} end if end repeat if oneLine is not equal to {} then set the end of outList to oneLine end if return outList end strToTategakiList –半角→全角変換 on hanToZen(aStr as string) set aString to NSString’s stringWithString:aStr return (aString’s stringByApplyingTransform:(NSStringTransformFullwidthToHalfwidth) |reverse|:true) as string end hanToZen –2D Listに配列の添字的なアクセスを行なってデータを取得 on getItemByXY(aX as integer, aY as integer, aList as list, aBlankItem) –1 based index try set aContents to contents of (item aX of item aY of aList) on error set aContents to aBlankItem end try return aContents end getItemByXY –2D Listに配列の添字的なアクセスを行なってデータを設定 on setItemByXY(aX as integer, aY as integer, tmpList as list, aContents) –1 based index set (item aX of item aY of tmpList) to aContents return tmpList end setItemByXY –空白の2D Array を出力する on make2DBlankArray(curLen as integer, curMax as integer) set outArray to {} repeat curMax times set tmpList to {} repeat curLen times set the end of tmpList to "" end repeat set the end of outArray to tmpList end repeat return outArray end make2DBlankArray –2D Listをアイテム間デリミタ、および行間デリミタを指定しつつテキスト化 on list2dToStringByUsingDelimiters(aList as list, itemDelimiter as string, lineDelimiter as string) set outList to {} repeat with i in aList set aStr to listToStringUsingTextItemDelimiter(i, itemDelimiter) of me set the end of outList to aStr end repeat return listToStringUsingTextItemDelimiter(outList, lineDelimiter) of me end list2dToStringByUsingDelimiters –1D Listをアイテム間デリミタ、および行間デリミタを指定しつつテキスト化 on listToStringUsingTextItemDelimiter(sourceList as list, textItemDelimiter as string) set anArray to NSArray’s arrayWithArray:sourceList return (anArray’s componentsJoinedByString:textItemDelimiter) as string end listToStringUsingTextItemDelimiter –2D Listの各要素のアイテム数のうち最多のものを返す on getMaxItemCountFrom2DArray(aList as list) set anArray to NSArray’s arrayWithArray:aList set bArray to (anArray’s valueForKeyPath:"@unionOfObjects.@count") return (bArray’s valueForKeyPath:"@max.self") as integer end getMaxItemCountFrom2DArray –特殊文字の横書き用から縦書き用への置き換え on retTateChar(aChar as string) if aChar = "<" then return "︿" if aChar = ">" then return "﹀" — if aChar = "《" then return "︽" if aChar = "》" then return "︾" — if aChar = "「" then return "﹁" if aChar = "」" then return "﹂" — if aChar = "『" then return "﹃" if aChar = "』" then return "﹄" — if aChar = "【" then return "︻" if aChar = "】" then return "︼" — if aChar = "[" then return "﹇" if aChar = "]" then return "﹈" — if aChar = "{" then return "︷" if aChar = "}" then return "︸" — if aChar = "(" then return "︵" if aChar = ")" then return "︶" — if aChar = "、" then return "︑" if aChar = "。" then return "︒" if aChar = "ー" then return "︱" if aChar = "~" then return "⌇" if aChar = "=" then return "‖" — if aChar = "1" then return "一" if aChar = "2" then return "二" if aChar = "3" then return "三" if aChar = "4" then return "四" if aChar = "5" then return "五" if aChar = "6" then return "六" if aChar = "7" then return "七" if aChar = "8" then return "八" if aChar = "9" then return "九" if aChar = "0" then return "〇" return aChar end retTateChar –とりあえずな禁則処理(任意改行を考慮し、2D Listでデータを受け取る) on kinsokuList2(toDList as list) set kinsokuCharList to {"︒", "︑", "﹁", "﹂", "﹃", "﹄", "︻", "︼", "﹇", "﹈", "︷", "︸", "︵", "︶", "︱", "⌇", "ァ", "ィ", "ゥ", "ェ", "ォ", "ョ", "ぁ", "ぃ", "ぅ", "ぇ", "ぉ", "ょ"} set outList to {} repeat with ii in toDList set aList to contents of ii set aLen to length of aList set startNum to 2 repeat set chgF to false repeat with i from startNum to aLen try set aChar to contents of first item of item i of aList on error –ちょっと強引、、、 exit repeat end try considering case and diacriticals –超重要!! if aChar is in kinsokuCharList then –行頭に禁則文字が入っていたら、前の行に追い出す set the end of item (i – 1) of aList to aChar set tmpList to contents of item i of aList set item i of aList to removeItemInArray(tmpList, 1) of me –リフロー処理 –repeat with refI from (i + ((i < aLen) as integer)) to aLen repeat with refI from (i + 1) to aLen –現在行の先頭の文字を取得 set aaChar to first item of item refI of aList –前行の末尾に追加 set the end of item (refI – 1) of aList to aaChar –現在行の先頭の文字を削除 set tmpList to contents of item refI of aList set item refI of aList to removeItemInArray(tmpList, 1) of me end repeat if chgF = false then set chgF to true copy (i + ((aLen > i) as integer)) to startNum end if end if end considering –超重要!! end repeat if chgF = false then exit repeat end repeat set outList to outList & aList end repeat return outList end kinsokuList2 on removeItemInArray(aList as list, anItemNo as integer) set anArray to NSMutableArray’s arrayWithArray:aList anArray’s removeObjectAtIndex:(anItemNo – 1) return anArray as list end removeItemInArray on offsetOf(aList as list, aTarg) set aArray to NSArray’s arrayWithArray:aList set aIndex to aArray’s indexOfObjectIdenticalTo:aTarg return ((aIndex as integer) + 1) end offsetOf –縦方向に空白行が存在していたら削除、末尾からスキャン on checkBlankVerticalLine(aList as list, aBlankChar as string) set tLen to length of (item 1 of aList) copy aList to bList set hitList to makeRepeatinglList(length of bList, true) of me set aCount to 1 repeat –縦方向に1行分、すべて空白文字かどうかチェック set workList to {} repeat with ii in bList set jj to contents of ii set the end of workList to (item aCount of jj = aBlankChar) end repeat –縦方向に1行空白だったら、1行分の削除を行う if workList = hitList then repeat with ii from 1 to length of bList set jj to contents of item ii of bList set item ii of bList to removeItemInArray(jj, 1) of me end repeat set tLen to tLen – 1 end if set aCount to aCount + 1 if aCount > tLen then exit repeat end if end repeat return bList end checkBlankVerticalLine –指定アイテムを指定個数連結したリストを作成 on makeRepeatinglList(hitNum as integer, hitItem) set outList to {} repeat hitNum times set the end of outList to hitItem end repeat return outList end makeRepeatinglList |
More from my site
(Visited 41 times, 1 visits today)