Archive for 5月, 2011

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/05/02 AS辞書ぜんぶHTMLに書き出し v3

AS Dictionaryで、Apple純正のデフォルトインストールされているアプリケーションの用語辞書をHTML書き出しするAppleScriptです。

Mac OS Xの新バージョンなど、内容や動作確認を行っておく必要がある場合に、インストール直後のOSに対してデフォルトでインストールされているアプリケーションやOSAXのAppleScript用語辞書を一括でHTML書き出ししておきます。

書き出したHTML書類は、FileMergeを使ってdiff表示を行い、機能の変更点を割り出すのに使います。とくにβ段階のOSでは個別の機能変更について詳細なガイダンスが出ているわけではないため、こうしたツールで変更点を推測することが重要です(こうした方法論が確立できていなかった頃は、OSのバージョンアップのたびにひどい目に遭っていました)。

Apple純正アプリ/OSAXの辞書書き出し……といっていますが、書き出し対象としてとくにApple純正アプリに限っているわけではないため、すでに実運用段階で(Apple純正以外の)アプリが大量に入っている環境においては、何かの対策を講じておく必要がありそうです。

スクリプト名:AS辞書ぜんぶHTMLに書き出し v3

set outPath to choose folder with prompt “AS辞書HTML書き出し先フォルダを選択”

tell application “ASDictionary” to launch

set apList to getScriptableAppPathList() of me

set ngList to {} –処理実行時にエラーになったアプリケーション/OSAXのパスが入る

–メインループ
repeat with i in apList
  set j to contents of i
  
if j is not equal to {} or j is not equal to “” then
    
    
–アプリケーションファイルの情報を取得
    
tell application “Finder”
      set aInfo to info for j
      
set sVer to short version of aInfo
      
set sVer2 to prepareShortVersionStringNum(sVer) of me
      
set sVerStr to replaceText(sVer2 as string, “.”, “”) of me
      
set prodName to displayed name of aInfo
    end tell
    
    
set outPathStr to (outPath as string) & prodName & ” “ & sVerStr & “.html”
    
    
    
–HTML書き出し
    
set htmlRes to false
    
tell application “ASDictionary”
      set exRes to export j to outPath using file formats {single file HTML} using styles {AppleScript} with showing hidden items without compacting classes
      
      
if success of (first item of exRes) = false then
        –Export失敗時
        
set the end of ngList to j
      else
        
        
–Export成功時
        
set htmlRes to true
        
set outFile to destination of (first item of exRes)
      end if
      
    end tell
    
    
    
–書き出したHTMLのリネーム
    
if htmlRes = true then
      tell application “Finder”
        tell file outFile
          set aName to name
          
          
–書き出したHTMLファイルにバージョン番号を反映させる
          
set bName to replaceText(aName, “-AS.html”, (” “ & sVerStr & “.html”)) of me
          
set name to bName
        end tell
      end tell
    end if
  end if
end repeat

ngList –書き出せなかったアプリの一覧

–デフォルトでインストールされているAS対応アプリケーションのリストを取得する
on getScriptableAppPathList()
  set apFol to path to applications folder
  
set utilFol to path to utilities folder
  
set sysFol to ((path to system folder) as string) & “Library:CoreServices:”
  
set sysLibFol to ((path to system folder) as string) & “Library:ScriptingAdditions:”
  
set devFol to ((path to startup disk) as string) & “Developer:Applications:”
  
set libPath to (path to library folder) & “ScriptingAdditins:”
  
  
tell application “Finder”
    –一般アプリケーション
    
tell folder apFol
      set ap1List to (every application file whose accepts high level events is true and has scripting terminology of it is true) as alias list
    end tell
    
    
–ユーティリティーフォルダー
    
tell folder utilFol
      set ap2List to (every application file whose accepts high level events is true and has scripting terminology of it is true) as alias list
    end tell
    
    
–SystemのCoreServicesフォルダ
    
tell folder sysFol
      set ap3List to (every application file whose has scripting terminology is true) as alias list
    end tell
    
    
–Developerフォルダ
    
try
      tell folder devFol
        set ap4List to (every application file whose has scripting terminology is true) as alias list
      end tell
    on error
      set ap4List to {}
    end try
    
    
–/System/Library/ScriptingAdditions フォルダのOSAX
    
try
      tell folder sysLibFol
        set osax1List to (every file whose name ends with “.osax”) as alias list
      end tell
    on error
      set osax1List to {}
    end try
    
    
    
–/Library/ScriptingAdditions フォルダのOSAX
    
try
      tell folder libPath
        set osax2List to (every file whose name ends with “.osax”) as alias list
      end tell
    on error
      set osax2List to {}
    end try
    
    
    
set appList to ap1List & ap2List & ap3List & ap4List & osax1List & osax2List
    
  end tell
  
  
return appList
  
end getScriptableAppPathList

–任意のデータから特定の文字列を置換
on replaceText(origData, origText, repText)
  set curDelim to AppleScript’s text item delimiters
  
set AppleScript’s text item delimiters to {origText}
  
set origData to text items of origData
  
set AppleScript’s text item delimiters to {repText}
  
set origData to origData as text
  
set AppleScript’s text item delimiters to curDelim
  
–set b to origData as text
  
return origData
end replaceText

–short version文字列をよろしく処理する(major.minor1.minor2)
–short versionに英語や日本語の文字をズラズラ並べていた場合には所期の動作を行えない
on prepareShortVersionStringNum(sVer)
  set curDelim to AppleScript’s text item delimiters
  
set AppleScript’s text item delimiters to {“.”}
  
set sList to text items of sVer
  
set AppleScript’s text item delimiters to curDelim
  
  
set sLen to length of sList
  
if sLen = 2 then
    set sVer to sVer & “.0″
  else if sLen = 1 then
    set sVer to sVer & “.0.0″
  end if
  
  
return sVer
end prepareShortVersionStringNum

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