Archive for the 'TextWrangler' Category

2017/02/14 Bare Bones SoftwareがTextWranglerを廃止してBBEditに一本化

Mac系の老舗ソフトウェア開発会社Bare Bones Softwareのフリー版テキストエディタ「TextWrangler」が廃止になり、BBEditに一本化されることが2017年初頭に発表になっていました。

bbsoftware_resized.png

たまたま用事があって、Bare Bones Softwareに連絡をとったら「TextWranglerが廃止になった」ことを知りました。すぐにWebサイト上からダウンロードできなくなるわけではないとは思いますが、時間の問題でしょう。

ちなみに、BBEditは同社のWebサイトからお試し版がダウンロードできて、30日間無料で試用が可能です。30日をすぎたあとは、TextWrangler相当の永遠お試し版として使い続けられる様子です。

bbeditandtw_resized.png

たしかに、TextWranglerはBBEditの「お試し版」的な位置付けで開発され、広く愛用されたソフトウェアではありました。しかし昨今では、逆にTextWranglerの知名度が上がりすぎてBBEditへの移行を促す販促製品としてはふさわしくない存在になっていたことも事実であります。

自分の常用しているテキストエディタは、mi、TextWranglerの2本。どちらかといえば、TextWranglerの方が多いかなといったところ。

BBEditについては、「重そう」とか「HTMLコンテンツ作成系の不要な機能がいっぱいついていてメニューがごたごたしている」といった印象を持っていたのですが、(久しぶりに)実際に動かしてみると、それほど違いがあるわけでもないようです(メニューが少し多いかな、ぐらい?)。

AppleScript用語辞書について、TextWranglerをそれほど重箱の隅までつつきまくったわけではなかったのですが、比較してみたら(ささいな違いをのぞくと)31か所違っていました。BBEditの方が多機能です。

asdictdiff_resized.png

ただ、TextWrangler用のAppleScriptはほぼそのままBBEdit用に転用できるので、何も考えないレベルで使いまわしが可能でしょう。

2012/01/14 ドロップされたASをTextWranglerでdiff表示

ドロップされたAppleScriptをTextWrangler(version 3.5.3)でdiff表示するAppleScriptです。他のAppleScriptのファイルを処理してdiff表示(差分表示)を行うユーティリティ的なものです。

以前に、「ドロップされたASをdiff表示 Mac OS X 10.4対応版」というものを作ったことがありました。AppleScriptをdiff表示するのに、普通はApple純正のFileMergeを使っているのですが、そのためには文字コードなどの書き換えをする必要があり、TextWranglerを併用して……TextWrangler自体がdiff表示機能を持っていることを思い出し、TextWranglerでdiff表示させるというものでした。

すでに決着が付いたかのように思われていた、AppleScript業界の「diff問題」が再燃したのは、読者がいるんだかいないんだかさっぱり不明なこのBlogの、読者の方からの1通のメールからでした。

『いつもお世話になります。(サイトに)

希望といいますか要望だけで申し訳ないのですが、「ドロップされたASをdiff表示 Mac OS X 10.4対応版」の10.6対応版などを作ってはいただけないでしょうか?
というのも、10.6ならdiff表示v4で十分なはずなんですが、業務PCにてXcodeのインストールが許可されていないという事情がありまして、もしよろしければ、ご検討いただけますようお願いいたします。』

……「スクリプトエディタ」を操作していたところを「AppleScriptエディタ」に書き換えれば瞬殺ではないか、と思って手をつけてみたら……意外とたいへんでした(汗)

Mac OS X 10.6上でTextWranglerを使ってcompare fileコマンドでdiffを取ろうとすると……謎のエラーが出ます。

set oldPath to choose file
set newPath to choose file

set oldPath to oldPath as string
set newPath to newPath as string

tell application “TextWrangler”
  compare file oldPath against file newPath
end tell

こんな、最低限の基礎的な記述に戻してあげて(トラブル時にものすごく大事なやりかた)、テキストに書き出したAppleScriptを2つ指定してみると……あいかわらずエラーになります。

 「もう、TextWranglerじゃなくて別のツールでも使おうか……」

日も暮れて、そう考えかけたころ、「fileで指定しているのがいけないのでは?」と気付き、aliasで渡してみたら何事もなかったように表示されました。

tw_diff106.jpg

そもそも、TextWranglerのAppleScript用語辞書(アプリケーションのアイコンをAppleScriptエディタにドラッグ&ドロップすると表示)を見てみると、

twdic.jpg

などと書いてあるので、「そうかーaliasじゃダメなんだー」と受け取ったからです。これは、TextWranglerのAppleScript用語辞書が間違っています。

asdic.jpg

▲こんな風に書かなくては(AppleScriptエディタの用語辞書より「open」命令の記述)

このScriptをアプリケーション形式で保存し、出来上がったドロップレットに2つのAppleScript書類をドロップすると、TextWranglerでdiff表示を行います。

スクリプト名:asdiff
on run
  –環境確認を行うべき(書いてない)
  
  
–FileMergeの起動を最初にやっておく
  
tell application “System Events”
    set fmExists to (exists of process “TextWrangler”)
  end tell
  
  
if fmExists = false then
    tell application “TextWrangler”
      launch
    end tell
  end if
  
end run

on open fileList
  
  
tell application “Finder”
    set sortedList to sort fileList by creation date
  end tell
  
  
set sortedList to reverse of sortedList
  
  
set oldPath to writeASSourceToTempFolder((item 1 of sortedList) as alias)
  
set newPath to writeASSourceToTempFolder((item 2 of sortedList) as alias)
  
  
–do shell script “/usr/bin/opendiff ” & oldPath’s POSIX path’s quoted form & ” ” & newPath’s POSIX path’s quoted form & ” > /dev/null 2>&1 &”
  
  
tell application “TextWrangler”
    compare oldPath against newPath –Mac OS X 10.6用にaliasで渡すように書き換えた
  end tell
  
  
end open

–AppleScriptのソースを取得してファイルに書き出し
on writeASSourceToTempFolder(aScript)
  –ASのソースを取得
  
set scriptSource to getContentsOfScript(aScript) of me
  
if scriptSource = false then
    display dialog “指定のASのオープン時にエラーが発生”
    
return false –エラー
  end if
  
  
tell application “Finder”
    set origName to name of file aScript
  end tell
  
set origName to makestr_alphabetNumeric_only(origName) of me
  
  
  
–tmpにASのソースを一時ファイルとして保存
  
set tmpPath to (path to temporary items from system domain) as string
  
set aFN to do shell script “/bin/date +%Y%m%d_%H%M%S”
  
set tmpPathFull to tmpPath & origName & “_” & aFN & “.txt”
  
set fRes to write_to_file_UTF8(scriptSource, tmpPathFull, false) of me
  
if fRes = true then
    return tmpPathFull as alias –書き出したテキストのフルパスを返す(10.6用に変更)
  else
    return false –エラー
  end if
end writeASSourceToTempFolder

–指定したAppleScriptのソースを取得する(Mac OS X 10.4用)
on getContentsOfScript(aScript)
  tell application “AppleScript Editor”
    try
      with timeout of 600 seconds –アプリケーションの起動に時間がかかるケースもあるので180秒から延長
        set aScript to open aScript
      end timeout
    on error
      return false
    end try
    
    
tell window 1
      set aName to name
    end tell
    
    
tell document aName
      set aCon to contents
      
close without saving
    end tell
  end tell
  
  
return aCon
end getContentsOfScript

–ファイルへのUTF8での書き込み
on write_to_file_UTF8(this_data, target_file, append_data)
  try
    set the target_file to the target_file as text
    
set the open_target_file to ?
      open for access file target_file with write permission
    if append_data is false then ?
      set eof of the open_target_file to 0
    write this_data to the open_target_file as «class utf8» starting at eof
    
close access the open_target_file
    
return true
  on error
    try
      close access file target_file
    end try
    
return false
  end try
end write_to_file_UTF8

–アルファベットと数字のみの文字列にして返す
on makestr_alphabetNumeric_only(aKeyword)
  set aKeyword to aKeyword as string
  
set aKeyword to aKeyword as Unicode text
  
  
set cList to characters of aKeyword
  
set newName to “”
  
  
repeat with i in cList
    set aRes to checkAN(i) of me
    
if aRes = true then
      set newName to newName & (i as string)
    end if
  end repeat
  
  
return newName
end makestr_alphabetNumeric_only

on checkAN(aKeyword)
  set anList to {“a”, “b”, “c”, “d”, “e”, “f”, “g”, “h”, “i”, “j”, “k”, “l”, “m”, “n”, “o”, “p”, “q”, “r”, “s”, “t”, “u”, “v”, “w”, “x”, “y”, “z”, “-”, “+”, “.”, “_”, “=”, “(”, “)”, “#”, “$”, “%”, “&”, “~”, “^”, “0″, “1″, “2″, “3″, “4″, “5″, “6″, “7″, “8″, “9″}
  
  
set aKeyword to aKeyword as Unicode text
  
set aKeyword to aKeyword as string
  
set kList to characters of aKeyword
  
repeat with i in kList
    ignoring case
      if i is not in anList then
        return false
      end if
    end ignoring
  end repeat
  
return true
end checkAN

▼新規書類に ▼カーソル位置に ▼ドキュメント末尾に

2011/09/25 TextWranglerで連続置換を指定フォルダ内のhtmlファイルに対してすべて実行

TextWranglerで連続置換を指定フォルダ内のhtmlファイルに対してすべて実行するAppleScriptです。

冒頭の「指定フォルダ内のHTMLを取得する」とか、HTMLの置換内容自体はドーでもよくて、「TextWrangler上での文字置換の方法のサンプル」としてのみ価値があります。

TextWranglerはGUI画面側からもAppleScript上からもよく使っており、これなしでは各種作業が滞ります。単なるテキストファイルを操作するだけなら直接テキストファイルを読み込んで処理すればよいのですが、文字コードを厳密に指定しなければならないような場合には、テキストエディタをAppleScriptでコントロールする必要が出てきます。勝手に書き換えたりするのはまずいので。

そんな時に国産のテキストエディタは……Jedit Xは何か全力で間違った方向に突っ走っているし、miだとAppleScript側から使える機能がいまひとつ。本来はBBeditを活用すべきところですが、そこまで重武装のエディタは必要ないし……結果としてTextWranglerが大活躍することに。

たぶん、(フリーなのに使えまくる)TextWranglerがなくなったらものすごく困ると思います。

スクリプト名:TextWranglerで連続置換を指定フォルダ内のhtmlファイルに対してすべて実行
set aFol to choose folder

tell application "Finder"
  tell folder aFol
    set aList to (every file whose name ends with ".html") as alias list
  end tell
end tell

tell application "TextWrangler"
  repeat with i in aList
    close every text document
    
open i
    
    
set anID to 65 –Ascii number of "A"
    
    
repeat
      set fRes to find "<input type=’radio’ name=’Choice’" searching in text of text document 1 options {starting at top:true}
      
set fFlag to found of fRes
      
      
if fFlag = false then exit repeat
      
      
set fObj to found object of fRes
      
      
select fObj
      
      
set contents of selection to "<input type=’radio’ name=’Choice" & (ASCII character anID) & "’"
      
set anID to anID + 1
    end repeat
    
    
close text document 1 saving yes
    
  end repeat
end tell

▼新規書類に ▼カーソル位置に ▼ドキュメント末尾に

2011/05/05 ドロップされたASをdiff表示 Mac OS X 10.4対応版

ドロップされた2つのAppleScript書類のdiff表示を行うAppleScriptのMac OS X 10.4対応版です。

まず、本AppleScriptを実行形式で保存(ドラッグ&ドロップを受け付けるドロップレットになる)しておき、比較を行うAppleScript2本をそのドロップレットにドラッグ&ドロップします。

Mac OS X 10.4上でTextWlangerがインストールされていれば、スクリプトエディタ経由でテキストを受け取ってTextWrangler上でTextWranglerのビルトインのdiff機能を用いてdiff表示を行います。

tw1.jpg

FileMergeでdiff表示することも考えないではなかったのですが、結局テキスト処理のためにTextWranglerが必要になってしまい、

 「それなら、TextWranglerでdiff表示させたほうが……」

ということで、TextWranglerでdiff表示させた次第です。なお、現時点でBareBones SoftwareからダウンロードできるTextWranglerは最低でもMac OS X 10.5を必要とするため、Mac OS X 10.4対応のTextWranglerをすでに用意してある環境でのみの実行が可能です。

スクリプト名:asDiff3.10411
on run
  環境確認を行うべき(書いてない)
  
  
FileMergeの起動を最初にやっておく
  
tell application "System Events"
    set fmExists to (exists of process "TextWrangler")
  end tell
  
  
if fmExists = false then
    tell application "TextWrangler"
      launch
    end tell
  end if
  
end run

on open fileList
  
  
tell application "Finder"
    set sortedList to sort fileList by creation date
  end tell
  
  
set sortedList to reverse of sortedList
  
  
set oldPath to writeASSourceToTempFolder((item 1 of sortedList) as alias)
  
set newPath to writeASSourceToTempFolder((item 2 of sortedList) as alias)
  
  
do shell script "/usr/bin/opendiff " & oldPath’s POSIX path’s quoted form & " " & newPath’s POSIX path’s quoted form & " > /dev/null 2>&1 &"
  
  
tell application "TextWrangler"
    compare file oldPath against file newPath
  end tell
  
  
end open

AppleScriptのソースを取得してファイルに書き出し
on writeASSourceToTempFolder(aScript)
  ASのソースを取得
  
set scriptSource to getContentsOfScript(aScript) of me
  
if scriptSource = false then
    display dialog "指定のASのオープン時にエラーが発生"
    
return false エラー
  end if
  
  
tell application "Finder"
    set origName to name of file aScript
  end tell
  
set origName to makestr_alphabetNumeric_only(origName) of me
  
  
  
tmpにASのソースを一時ファイルとして保存
  
set tmpPath to (path to temporary items from system domain) as string
  
set aFN to do shell script "/bin/date +%Y%m%d_%H%M%S"
  
set tmpPathFull to tmpPath & origName & "_" & aFN & ".txt"
  
set fRes to write_to_file_UTF8(scriptSource, tmpPathFull, false) of me
  
if fRes = true then
    return tmpPathFull 書き出したテキストのフルパスを返す
  else
    return false エラー
  end if
end writeASSourceToTempFolder

指定したAppleScriptのソースを取得する(Mac OS X 10.4用)
on getContentsOfScript(aScript)
  tell application "Script Editor"
    try
      with timeout of 600 seconds アプリケーションの起動に時間がかかるケースもあるので180秒から延長
        set aScript to open aScript
      end timeout
    on error
      return false
    end try
    
    
tell window 1
      set aName to name
    end tell
    
    
tell document aName
      set aCon to contents
      
close without saving
    end tell
  end tell
  
  
return aCon
end getContentsOfScript

ファイルへのUTF8での書き込み
on write_to_file_UTF8(this_data, target_file, append_data)
  try
    set the target_file to the target_file as text
    
set the open_target_file to
      open for access file target_file with write permission
    if append_data is false then
      set eof of the open_target_file to 0
    write this_data to the open_target_file as «class utf8» starting at eof
    
close access the open_target_file
    
return true
  on error
    try
      close access file target_file
    end try
    
return false
  end try
end write_to_file_UTF8

アルファベットと数字のみの文字列にして返す
on makestr_alphabetNumeric_only(aKeyword)
  set aKeyword to aKeyword as string
  
set aKeyword to aKeyword as Unicode text
  
  
set cList to characters of aKeyword
  
set newName to ""
  
  
repeat with i in cList
    set aRes to checkAN(i) of me
    
if aRes = true then
      set newName to newName & (i as string)
    end if
  end repeat
  
  
return newName
end makestr_alphabetNumeric_only

on checkAN(aKeyword)
  set anList to {"a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "-", "+", ".", "_", "=", "(", ")", "#", "$", "%", "&", "~", "^", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9"}
  
  
set aKeyword to aKeyword as Unicode text
  
set aKeyword to aKeyword as string
  
set kList to characters of aKeyword
  
repeat with i in kList
    ignoring case
      if i is not in anList then
        return false
      end if
    end ignoring
  end repeat
  
return true
end checkAN

▼新規書類に ▼カーソル位置に ▼ドキュメント末尾に

2011/04/02 ドロップされたASをFileMergeでビジュアルdiff表示

FileMergeで2つのAppleScriptをdiff表示するAppleScriptです。

使用時には、アプリケーション形式で保存してドロップレットとして使います。保存したドロップレットに2つのAppleScriptのファイルをドラッグ&ドロップすると、osadecompileコマンドでAppleScriptをUTF-8のテキストに変換し、さらにTextWranglerでBOMつきのUTF-8に変換します。変換が終わったら、FileMergeでdiff表示します。

実行にはFileMerge(Xcodeをインストールすると入ってくる)と、TextWrangler(Bare Bones Softwareからフリーで配布されています)が必要です。Mac OS X 10.6上でのみ実行可能です。

「指定のAppleScriptをosadecompileでUTF-8のテキストに変換して、さらにUTF-8(BOMつき)にTextWranglerで変換して、パスを返す」AppleScriptを作ったあとに、FileMergeのフィルタからAppleScriptを呼び出してみたのですが、パスを返したらパスの文字列同士でdiffをとられてしまうし、ファイル内容をstdoutに返したら元のダメな表示に逆戻り。この方法ではまったくダメでした。

そんなときに、FileMergeをコマンドラインから呼び出せるはずだと思い立ち、いろいろ探してみると「opendiff」という名前で呼び出せるという情報に行き当たりました

そこで、これまでに作ったさまざまなサブルーチンをごてごてとコピー&ペーストでまとめつつ、ちょっとだけコードを書いて希望の動作を行わせることに成功。

diff3.jpg

日本語が入ったAppleScriptのプログラムを、きちんとdiff表示できています。

diff4.jpg

ただ、opendiffを呼び出したあとにドロップレットがそのまま実行から帰ってこないのですが……このあたりはまだ検討の余地がありそうです。

もともと、FileMergeのフィルタとして作り始めた本AppleScriptですが、結局AppleScriptのドロップレットにするのであれば、なんとなくAppleScriptエディタをAppleScriptからコントロールして操作するとか、そういう方法のほうがTextWranglerを引っ張り出してくる必要もなかったんじゃないかと思うものです。

まあでも、トータル半日ぐらいで希望の動作が実現できたのでよしとしましょう。実行後にドロップレットから結果が返ってこないで無反応になってしまいますが、強制終了させてやってください。

diff5.jpg

スクリプト名:ドロップされたASをdiff表示
on run
  –環境チェック
  
  
(*


  本来はここで、TextWranglerやFileMerge(opendiff)などが実行環境に存在するかどうかチェックすべき
  実行するOSのバージョンもチェックしておいたほうがよい
  
  *)

end run

on open fileList
  –2つのファイルがドロップされているかを判定。フォルダとかバンドルがドロップされる可能性は否定できないものの、ノーチェック
  
–スクリプトバンドルがきたら、AppleScriptエディタ経由で内容を取得する???
  
if length of fileList is not equal to 2 then
    display dialog “かならず1組(2つ)のファイルをドロップしてください。” buttons {“OK”} default button 1 with icon 1
    
return
  end if
  
  
–ファイル作成日でソート(古いものから新しいものへ)
  
set aliasRes to sortAliasByCreationDate(fileList) of me
  
  
set {file1Path, file2Path} to aliasRes
  
  
–UTF8 with BOMに変換
  
set file1PosixPath to decompileASandSaveAsUTF8withBOM(file1Path) of me
  
set file2PosixPath to decompileASandSaveAsUTF8withBOM(file2Path) of me
  
  
do shell script “/usr/bin/opendiff “ & quoted form of file1PosixPath & ” “ & quoted form of file2PosixPath & “&”
  
end open

–指定のAppleScriptをosadecompileでUTF-8のテキストに変換して、さらにUTF-8(BOMつき)にTextWranglerで変換して、パスを返す
on decompileASandSaveAsUTF8withBOM(aFile)
  set aTmp to ((path to temporary items from system domain) as string) & (do shell script “/usr/bin/uuidgen”) & “.txt”
  
set aTmpFile to POSIX path of aTmp
  
  
do shell script “/usr/bin/osadecompile “ & quoted form of POSIX path of aFile & ” > “ & quoted form of aTmpFile
  
  
  
–TextWranglerを起動して不可視に
  
tell application “TextWrangler” to launch
  
  
tell application “System Events”
    tell process “TextWrangler”
      set visible to false
    end tell
  end tell
  
  
  
–TextWranglerでUTF8のファイルをUTF8(With BOM)に変換する
  
tell application “TextWrangler”
    set aDoc to open file aTmp reading as UTF8 file
    
set distEncoding to encoding of aDoc
    
    
–BOMなしのUTF8だったらBOMつきUTF8に変更する
    
–”Unicode (UTF-8)”
    
–”Unicode (UTF-8, with BOM)”
    
if distEncoding = “Unicode (UTF-8)” then
      set encoding of aDoc to “Unicode (UTF-8, with BOM)”
    end if
    
    
save aDoc add to recent list boolean false –最近使ったファイルの一覧に登録しない
    
close aDoc without saving
    
  end tell
  
  
return aTmpFile
  
end decompileASandSaveAsUTF8withBOM

–ファイル作成日でソート(古いものから新しいものへ)
on sortAliasByCreationDate(aliasList)
  
  
tell application “Finder”
    set aList to {}
    
    
repeat with i in aliasList
      set j to contents of i
      
set the end of aList to {j, creation date of j}
    end repeat
    
    
set cList to shellSortListAscending(aList, 2) of me –で作成日時でソート
    
    
    
set aliasList to {}
    
set fnCount to 1
    
repeat with i in cList
      set j to contents of (item 1 of i)
      
      
set the end of aliasList to j
    end repeat
  end tell
  
  
return aliasList
  
end sortAliasByCreationDate

–シェルソートで入れ子のリストを昇順ソート
on shellSortListAscending(a, keyItem)
  set n to length of a
  
set cols to {1391376, 463792, 198768, 86961, 33936, 13776, 4592, 1968, 861, 336, 112, 48, 21, 7, 3, 1}
  
repeat with h in cols
    if (h (n - 1)) then
      repeat with i from h to (n - 1)
        set v to item (i + 1) of a
        
set j to i
        
repeat while (j h) and ((contents of item keyItem of item (j - h + 1) of a) > (item keyItem of v))
          set (item (j + 1) of a) to (item (j - h + 1) of a)
          
set j to j - h
        end repeat
        
set item (j + 1) of a to v
      end repeat
    end if
  end repeat
  
return a
end shellSortListAscending

–シェルソートで入れ子のリストを降順ソート
on shellSortListDecending(a, keyItem)
  set n to length of a
  
set cols to {1391376, 463792, 198768, 86961, 33936, 13776, 4592, 1968, 861, 336, 112, 48, 21, 7, 3, 1}
  
repeat with h in cols
    if (h (n - 1)) then
      repeat with i from h to (n - 1)
        set v to item (i + 1) of a
        
set j to i
        
repeat while (j h) and ((contents of item keyItem of item (j - h + 1) of a) < (item keyItem of v))
          set (item (j + 1) of a) to (item (j - h + 1) of a)
          
set j to j - h
        end repeat
        
set item (j + 1) of a to v
      end repeat
    end if
  end repeat
  
return a
end shellSortListDecending

▼新規書類に ▼カーソル位置に ▼ドキュメント末尾に

2011/04/02 指定のAppleScriptをosadecompileでUTF-8のテキストに変換して、さらにUTF-8(BOMつき)にTextWranglerで変換して、パスを返す

指定のAppleScriptをosadecompileコマンドでUTF-8のテキストに変換し、さらにTextWranglerでBOMつきのUTF-8に変換して返すAppleScriptです。

AppleのXcodeと一緒にインストールされる「FileMerge」は2つのファイルの間の相違点をピックアップするdiff系のツールとしては、Mac OS X上では最高に出来がよく、使いやすいものだと(個人的に)思っています。

diff1.jpg

これを使ってAppleScriptのプログラムの相違点・変更点をリストアップできると便利ですが、残念ながらFileMergeが扱えるのはテキストファイルであり、AppleScriptのファイルをそのまま渡すことはできません。

そこで、Mac OS X標準装備のosadecompileコマンドを用いてAppleScriptのファイルをテキストファイルに変換し、それをFileMergeに渡せるとよいのではないかと考えました。

FileMergeにはファイルタイプごとに前処理を行うフィルタを設定でき、osadecomileコマンドを呼び出せるとよさそうです。TextWranglerでなくとも、UTF-8をBOMつきのUTF-8に変換するコマンドラインツールがあれば、そちらのほうがよさそうですが……さて、あるものなのか……???

diff2.jpg

ところが……このAppleScriptの中に日本語の文字列が入っているとうまく行きません。

osadecompileが出力する結果はUTF-8。しかし、そのままではFileMergeが読み込むことはできません。iconvを使ってUTF-8からさまざまな文字コードに変換してFileMergeに渡してもダメ。

さらに調べてみると、UTF-8でもBOMつきのUTF-8に変換すると、FileMergeが処理できることが分かりました。iconvでは役に立たなかったので、BareBones Softwareからフリー配布されているテキストエディタTextWranglerで変換するようにしてみました。

まだ機能を詰め切れていませんが、これで指定のAppleScriptの内容をFileMergeで比較できるように変換できています。

あとは、変換したファイルをいかにFileMergeに渡すかですが…………いっそ、このAppleScriptを/usr/local/binあたりに放り込んでおいて、FileMergeのフィルタから呼び出せばいいのかもしれません。

スクリプト名:指定のAppleScriptをosadecompileでUTF-8のテキストに変換して、さらにUTF-8(BOMつき)にTextWranglerで変換して、パスを返す
set aFile to choose file
set aRes to decompileASandSaveAsUTF8withBOM(aFile) of me

–指定のAppleScriptをosadecompileでUTF-8のテキストに変換して、さらにUTF-8(BOMつき)にTextWranglerで変換して、パスを返す
on decompileASandSaveAsUTF8withBOM(aFile)
  set aTmp to ((path to temporary items from system domain) as string) & (do shell script “/usr/bin/uuidgen”) & “.txt”
  
set aTmpFile to POSIX path of aTmp
  
  
do shell script “/usr/bin/osadecompile “ & quoted form of POSIX path of aFile & ” > “ & quoted form of aTmpFile
  
  
  
–TextWranglerを起動して不可視に
  
tell application “TextWrangler” to activate
  
  
tell application “System Events”
    tell process “TextWrangler”
      set visible to false
    end tell
  end tell
  
  
  
–TextWranglerでUTF8のファイルをUTF8(With BOM)に変換する
  
tell application “TextWrangler”
    set aDoc to open file aTmp reading as UTF8 file
    
set distEncoding to encoding of aDoc
    
    
–BOMなしのUTF8だったらBOMつきUTF8に変更する
    
–”Unicode (UTF-8)”
    
–”Unicode (UTF-8, with BOM)”
    
if distEncoding = “Unicode (UTF-8)” then
      set encoding of aDoc to “Unicode (UTF-8, with BOM)”
    end if
    
    
save aDoc add to recent list boolean false –最近使ったファイルの一覧に登録しない
    
close aDoc without saving
    
  end tell
  
  
return aTmp as alias
  
end decompileASandSaveAsUTF8withBOM

▼新規書類に ▼カーソル位置に ▼ドキュメント末尾に

2009/01/21 TextWranglerで選択中のテキストを取得

BARE BONES Softwareといえば、Mac系プログラマ御用達のテキストエディタ「BBEdit」で有名ですが、その無料版がTextWrangler
(more…)