Archive for the 'MacDown' Category

2017/11/14 相対パスから絶対パスを計算して求める v2

相対パスから絶対パスを計算して求める( 峇霆爐箸覆訐簑丱僖后廚鮓気豊◆嵳燭┐蕕譴秦蠡丱僖后廚鬮「絶対パス」に変換する)AppleScriptです。

Markdown書類にリンクした画像のリンク切れチェックを行う必要があり、あまり考えずに作ってみました。

Markdown書類中にリンクした画像は相対パスでリンク先を記述しています。リンクについては指定画像を画像専用フォルダにコピーして相対パスを求め、リンクタグをクリップボードに入れるAppleScriptを書いて(リンクを)記述しています。

このとき、Markdown書類群のフォルダ階層構造を維持していればリンク切れは起こりませんが、一応チェックしておきたいのが人情。

そこで、チェック用のScriptを書いておくことに。だいたいはありあわせのサブルーチンを組み合わせることでSpotlight経由のMarkdown書類の検索や正規表現によるMarkdown中の画像リンク箇所の抽出など、たいした手間もかけずに記述できます。

ただ、Markdown書類のパス(絶対パス)をもとに、書類中に書かれている相対パスから実際にリンク画像が存在している絶対パスを求めるサブルーチンが存在していませんでした(OS側に用意されていてもよさそうなものですが)。

そこで、本ルーチンを書いて使ってみました。とくに問題もなく使えています。

AppleScript名:相対パスから絶対パスを計算して求める v2
– Created 2017-11-11 by Takaaki Naganoya
use AppleScript version “2.4″
use scripting additions
use framework “Foundation”
–http://piyocast.com/as/archives/4976

set absolutePath to “/Users/me/Documents/–Book 1「AppleScript最新リファレンス バージョン2」/5000 iOSデバイスとの連携/5100 iOSデバイスからMacに画面を出力するAirServer.md”
set relativePath to “../9999_images/img-1.jpeg”

set relativePath to calcAbsolutePath(absolutePath, relativePath) of me
–>  ”/Users/me/Documents/–Book 1「AppleScript最新リファレンス バージョン2」/9999_images/img-1.jpeg”

on calcAbsolutePath(aAbsolutePOSIXfile, bRelativePOSIXfile)
  set aStr to current application’s NSString’s stringWithString:aAbsolutePOSIXfile
  
set bStr to current application’s NSString’s stringWithString:bRelativePOSIXfile
  
  
set aList to aStr’s pathComponents() as list
  
set bList to bStr’s pathComponents() as list
  
  
set aLen to length of aList
  
  
set aCount to 1
  
repeat with i in bList
    set j to contents of i
    
if j is not equal to “..” then
      exit repeat
    end if
    
set aCount to aCount + 1
  end repeat
  
  
set tmp1List to items 1 thru (aLen - aCount) of aList
  
set tmp2List to items aCount thru -1 of bList
  
  
set allRes to current application’s NSString’s pathWithComponents:(tmp1List & tmp2List)
  
  
return allRes as text
end calcAbsolutePath

★Click Here to Open This Script 

2017/11/10 選択した画像を画像フォルダにコピーして、Markdown書式で画像パスタグをクリップボードに転送 v2

指定の画像を、書いている書籍の画像フォルダにコピーして、作成中のMarkdown書類からの相対パスを求めてMarkdown形式の画像リンクタグをクリップボードに転送するAppleScriptです。

md1.png

書籍の執筆作業は、「–」ではじまる名前の書籍ルートフォルダ以下に章ごとのフォルダを作成し、その中にMarkdown書類やPages書類を入れています。

画像については各原稿と同じフォルダ内ではなく、画像専用フォルダに配置(一般的なWebサイトの管理と同じ)。各Markdown書類には画像専用フォルダへの相対パスで画像リンクタグを入れています。

![md1.png](../9999_images/md1.png)

md2.png

本AppleScriptは、この書籍中の書籍中の画像専用フォルダに指定画像をコピーし、クリップボードに対して画像の相対パスを入れます。

書籍ルートフォルダ以下の画像専用フォルダを検索するためにSpotlight検索用の「MetaData Lib」を使用しています。

ファイルコピー時には画像専用フォルダ内のすべてのファイル名をチェックし、ファイル名の重複が発生していた場合にはファイル名末尾に連番をつけ、重複を回避しています。

前提としているMarkdownエディタは「MacDown」で、最前面の書類のパスを取得する部分でMacDownの機能を用いています。ただ、その程度の機能しか利用していないので、他のMarkdownエディタ用に転用するのも難しくないと思います(MarkdownエディタでAppleScriptに対応しているものが少数派なんですが)。

以前はMarkdown書類中にリンクする画像はDropboxにREST API経由でアップロードしてURLを用いていました。アップロード自体はそれなりですが、Markdown書類のオープン時や編集中、PDF出力時などは遅くて辟易しました。画像がローカルにあったほうが速度的なメリットが大きいと判断し、変更しました。

AppleScript名:選択した画像を画像フォルダにコピーして、Markdown書式で画像パスタグをクリップボードに転送 v2
– Created 2017-11-09 by Takaaki Naganoya
– 2017 Piyomaru Software
use AppleScript version “2.4″
use scripting additions
use framework “Foundation”
use mdLib : script “Metadata Lib” version “1.0.0″
–http://piyocast.com/as/archives/4968

property NSOrderedSame : a reference to current application’s NSOrderedSame
property NSFileManager : a reference to current application’s NSFileManager
property NSString : a reference to current application’s NSString

set imgPath to choose file of type {“public.image”}
set imgPOSIX to NSString’s stringWithString:(POSIX path of imgPath)
set imgFileName to (imgPOSIX’s lastPathComponent()) as string

–Get Front Document Path
tell application “MacDown”
  set dList to every document
  
if length of dList = 0 then
    display dialog “No Documents…” buttons {“OK”} default button 1
    
return
  end if
  
  
tell front document
    set aProp to properties
  end tell
  
  
set aPOSIXpath to POSIX path of ((file of aProp) as alias)
end tell

–Calculate Parent Book Folder Path
set aStr to NSString’s stringWithString:aPOSIXpath
set bStr to aStr’s stringByDeletingLastPathComponent()
set aList to bStr’s pathComponents() as list
–> {”/”, “Users”, “me”, “Documents”, “ぴよまるソフトウェア”, “書籍執筆関連、技術書典など”, “書籍原稿”, “–Book 1「AppleScript最新リファレンス」”, “5000 iOSデバイスとの連携”}

set bList to reverse of aList
–> {”5000 iOSデバイスとの連携”, “–Book 1「AppleScript最新リファレンス」”, “書籍原稿”, “書籍執筆関連、技術書典など”, “ぴよまるソフトウェア”, “Documents”, “me”, “Users”, “/”}

–Find Book Folder Root which name begins with “–”
set aCount to 1
set hitF to false
repeat with i in bList
  set j to contents of i
  
if j begins with “–” then –”–”ではじまる親フォルダを書籍のルートフォルダとみなす
    set hitF to true
    
exit repeat
  end if
  
set aCount to aCount + 1
end repeat

if hitF = false then
  display dialog “Folder structure error” buttons {“OK”} default button 1 with icon 1
  
return
end if

set cList to items 1 thru ((length of aList) - aCount + 1) of aList
set cStr to (NSString’s pathWithComponents:cList) as string

–Find Image folder in Book root folder
set theFolders to mdLib’s searchFolders:{cStr} searchString:“kMDItemContentType == [c]%@ && kMDItemFSName contains [c]%@” searchArgs:{“public.folder”, “_images”}

set theTargFol to contents of first item of theFolders
–> “/Users/me/Documents/ぴよまるソフトウェア/書籍執筆関連、技術書典など/書籍原稿/–Book 1「AppleScript最新リファレンス」/9999_images”

set newPath to ((NSString’s stringWithString:theTargFol)’s stringByAppendingPathComponent:imgFileName) as string
set newPath2 to chkExistPOSIXpathAndIncrementChildNumber(newPath) of me

–ファイルコピー
set aRes to my copyFileAt:imgPOSIX toFilePath:newPath2

–Markdown書類とコピーした画像ファイルの相対パスを計算する
set relativePath to calcRelativePath(aPOSIXpath, newPath2) of me

set allText to “![” & imgFileName & “](” & relativePath & “)”
–> “![img-2.php.jpeg](../9999_images/img-2.php.jpeg)”

set the clipboard to allText

–POSIX path stringを与えると、ファイル名の重複を検出して、ファイル名の名称回避を行って、ファイル名のみを返す
on chkExistPOSIXpathAndIncrementChildNumber(a)
  set aStr to NSString’s stringWithString:a
  
set bStr to aStr’s lastPathComponent()
  
set cStr to (bStr’s pathExtension()) as string
  
set dStr to (bStr’s stringByDeletingPathExtension()) as string
  
set eStr to (aStr’s stringByDeletingLastPathComponent()) as string
  
  
set aManager to NSFileManager’s defaultManager()
  
set aRes to (aManager’s fileExistsAtPath:aStr) as boolean
  
if aRes = false then return a
  
  
set hitF to false
  
repeat with i from 1 to 65535
    set tmpPath to (eStr & “/” & dStr & “_” & (i as string) & “.” & cStr)
    
set tmpStr to (NSString’s stringWithString:tmpPath)
    
set aRes to (aManager’s fileExistsAtPath:tmpStr) as boolean
    
set bRes to ((tmpStr’s caseInsensitiveCompare:eStr) is not equal to (NSOrderedSame)) as boolean
    
    
if {aRes, bRes} = {false, true} then
      set hitF to true
      
exit repeat
    end if
  end repeat
  
  
if hitF = false then return false
  
  
–ファイルパス(フルパス)からファイル名部分を取得
  
set returnFileName to tmpStr’s lastPathComponent()
  
return (returnFileName as string)
  
end chkExistPOSIXpathAndIncrementChildNumber

–ファイルコピー
on copyFileAt:origPOSIXPath toFilePath:newPOSIXPath
  set POSIXPath1 to NSString’s stringWithString:origPOSIXPath
  
set POSIXPath2 to NSString’s stringWithString:newPOSIXPath
  
set fileManager to NSFileManager’s defaultManager()
  
set theResult to fileManager’s copyItemAtPath:POSIXPath1 toPath:POSIXPath2 |error|:(missing value)
  
return (theResult as integer = 1)
end copyFileAt:toFilePath:

–2つのPOSIX pathの相対パスを計算する
on calcRelativePath(aPOSIXfile, bPOSIXfile)
  set aStr to NSString’s stringWithString:aPOSIXfile
  
set bStr to NSString’s stringWithString:bPOSIXfile
  
  
set aList to aStr’s pathComponents() as list
  
set bList to bStr’s pathComponents() as list
  
  
set aLen to length of aList
  
set bLen to length of bList
  
  
if aLen bLen then
    copy aLen to aMax
  else
    copy bLen to aMax
  end if
  
  
repeat with i from 1 to aMax
    set aTmp to contents of item i of aList
    
set bTmp to contents of item i of bList
    
    
if aTmp is not equal to bTmp then
      exit repeat
    end if
  end repeat
  
  
set bbList to items i thru -1 of bList
  
set aaItem to (length of aList) - i
  
  
set tmpStr to {}
  
repeat with ii from 1 to aaItem
    set the end of tmpStr to “..”
  end repeat
  
  
set allRes to NSString’s pathWithComponents:(tmpStr & bbList)
  
return allRes as text
end calcRelativePath

★Click Here to Open This Script 

2016/06/23 オープン中のMarkdownドキュメントに、レンダリングに時間のかかるタグ要素がないかチェック v2

Mac用のオープンソースのMarkdownエディタ「MacDown」でオープン中の最前面のドキュメントをしらべ、Markdownテキスト中にレンダリングに時間のかかる画像および表の構成タグが入っていないかどうかを調べるAppleScriptの改良版です。

実運用してみたら、Tableのレンダリングは画像(Drobpboxからダウンロードして表示するという)処理にかかる時間よりは手短に終わるので、

 画像:20秒待ち
 Table:3秒待ち
 通常:1秒待ち

と、待機秒数を段階的に可変で返すルーチンに仕様を変更しました。また、Tableの検出がleft alighn cellのみの検出だったので、right align cellのタグについても調査するようにしました。

目下、週末土曜日の技術書典に向けて絶賛ラストスパート中ですが、

 AppleScript最新リファレンス:300ページ超え(増加中)
 最新事情がわかる AppleScript 10大最新技術:100ページ(作業終了間近)

と、合計400ページをすでに超えており、1冊分ビルドするためのオーバーヘッド縮小のためにこのようなチューニングが必要になってくるわけです。

AppleScript名:オープン中のMarkdownドキュメントに、レンダリングに時間のかかるタグ要素がないかチェック v2
– Created 2016-06-22 by Takaaki Naganoya
– 2016 Piyomaru Software

set mdRes to retImgOrTableTagsInMarkdownDoc() of me

–オープン中のMarkdownドキュメントに、レンダリングに時間のかかるタグ要素がないかチェック
on retImgOrTableTagsInMarkdownDoc()
  
  
tell application “MacDown”
    tell document 1
      set aProp to properties –個別に要素にアクセスできなかったので、まとめてプロパティを取得
    end tell
  end tell
  
  
set stList to text of aProp –なぜか、結果がファイル名、HTML、生Markdownのリストで返ってくる
  
set aBody to last item of stList –生Markdownテキストを取り出し
  
  
set aIMGFlag to aBody contains “![” –Image
  
set aTableFlag1 to aBody contains “:—” –Table (left align or center align cell)
  
set aTableFlag2 to aBody contains “—:” –Table (right align or center align cell)
  
set aTableFlag to (aTableFlag1 or aTableFlag2)
  
  
if aIMGFlag = true then
    return 20 –画像入りは20秒
  else if aTableFlag = true then
    return 3 –テーブル入りは3秒
  else
    return 1 –通常は1秒
  end if
  
end retImgOrTableTagsInMarkdownDoc

★Click Here to Open This Script 

2016/06/22 オープン中のMarkdownドキュメントに、レンダリングに時間のかかるタグ要素がないかチェック

Mac用のオープンソースのMarkdownエディタ「MacDown」でオープン中の最前面のドキュメントをしらべ、Markdownテキスト中にレンダリングに時間のかかる画像および表の構成タグが入っていないかどうかを調べるAppleScriptです。

MacDownの書類やPagesの書類をまとめてデスクトップフォルダにPDFで出力するAppleScriptを運用していたら、画像を含むページで画像抜けが発生する現象が確認されました。画像をすべてDropboxに置いて、それをリンクしているので余計に時間がかかるんですね。

また、表を含むページのレンダリングには時間がかかるので(表を入れすぎという噂も)、そちらへの対策も念のために行うべきと思われました。

そこで、MacDownでオープン中のドキュメントのソースにアクセスして、画像や表のタグが入っているかどうかを調査。入っていればtrue、入っていなければfalseを返すように書いてみました。

このルーチンの結果を参照して、trueが返ってきた場合にはドキュメントのオープン後、長めに時間待ちして(15秒とか)そのあとでPDF出力を行えば安全です。

最初は、一律に1書類あたり15秒時間待ちをしていたのですが、280ページ本1冊、100ページ本1冊をすべて出力するのに時間がかかりすぎるため、必要な書類についてのみ時間待ちを行うように処理を最適化。

280ページの本については300ページ越えが確実なので、合計400ページも書いていることに。6月25日土曜日の技術書系同人誌即売会「技術書典」まであと少しです。

AppleScript名:オープン中のMarkdownドキュメントに、レンダリングに時間のかかるタグ要素がないかチェック
– Created 2016-06-22 by Takaaki Naganoya
– 2016 Piyomaru Software

set mdRes to retImgOrTableTagsInMarkdownDoc() of me

–オープン中のMarkdownドキュメントに、レンダリングに時間のかかるタグ要素がないかチェック
on retImgOrTableTagsInMarkdownDoc()
  
  
tell application “MacDown”
    tell document 1
      set aProp to properties –個別に要素にアクセスできなかったので、まとめてプロパティを取得
    end tell
  end tell
  
  
set stList to text of aProp –なぜか、結果がファイル名、HTML、生Markdownのリストで返ってくる
  
set aBody to last item of stList –生Markdownテキストを取り出し
  
  
set aIMGFlag to aBody contains “![” –Image
  
set aTableFlag to aBody contains “:—” –Table
  
  
–どちらか含んでいればレンダリングに時間がかかるのでフラグをtrueで返す
  
return (aIMGFlag or aTableFlag)
  
end retImgOrTableTagsInMarkdownDoc

★Click Here to Open This Script 

2016/06/18 指定フォルダ以下にあるMacDownとPages書類をソートしてPDFに書き出す

指定フォルダ以下にあるMacDownで記述したMarkdown書類と、Pages書類をすべての階層からピックアップしてファイル名でソートして、すべてデスクトップにPDFで書き出すAppleScriptです。

コンパイル(構文確認)および実行に際しては、Shane StanleyのScript Library「Bridge Plus」をインストールしておく必要があります。また、GUI Scriptingを利用しているため「システム環境設定」>「セキュリティとプライバシー」>「プライバシー」>「アクセシビリティ」でスクリプトエディタ(アプレットとして実行する場合にはアプレットそのもの)を登録して許可しておく必要があります。

「技術書典」に出す電子ブックのフォーマットがギリギリまで決まらず、しかも縦長のスクロールさせるタイプのものにできないかとあがいていたのですが、結局iPadあたりで読むことを考慮するとiPadのリーダーの仕様にしたがう必要があります。

……あれ?(^ー^; 結局、ページめくりは発生するし、一般的な本と同じような体裁になってしまいますよ → フォーマットがPDFになりました。

Markdown書類とPages書類が混在しているフォルダ構造のトップ階層のフォルダを指定すると、Markdown書類とPages書類をピックアップし、ファイル名でそれらをソートし、順次PDFに書き出すAppleScriptを書いてみました(必要は発明のマザー!)。

book1.png

ただ、MacDownには「書類をPDFに書き出す」という機能がAppleScript側に公開されていません(T_T)。

macdown_dict.png

ないものを「ないない」と嘆いても仕方がないので、さっさとGUI Scriptingで強制的にメニュー操作することにしました。

macdown_gui.png

で、どこに? どこに保存させるのでしょう??

大丈夫! そんなときには、保存ダイアログで幾つかのフォルダに強制的に移動させるキーボードショートカットが存在しており、Command-Dは「カレントディレクトリをデスクトップに移動させる」=「保存先をデスクトップにする」働きをします。

このため、保存先を操作しづらい(不可能とはいいませんけれども)GUI Scriptingにおいて保存先を指定することが、デスクトップフォルダについては可能になっています。

Pagesの方はひじょうに素直に(GUI Scriptingなんて使わずに)PDF書き出しが可能です。

そんなわけで、時間に追い詰められながらもなんとか大量のデータ処理を行っているのでありました。書き出した大量のPDFもAppleScriptでさくっと連結できるので、非常にいい感じです。あとは、本が完成すれば、、、、

AppleScript名:指定フォルダ以下にあるMDとPagesをソートしてPDFに書き出す
– Created 2016-06-17 by Takaaki Naganoya
– 2016 Piyomaru Software
use AppleScript version “2.4″
use scripting additions
use framework “Foundation”
use BridgePlus : script “BridgePlus”
–use spotLight : script “spotlightLib”

property searchRes : {}

load framework

set origPath to POSIX path of (choose folder with prompt “Markdown/Pages ファイルの入っているフォルダを選択”)

set aResList to (spotlightSearch(origPath, “kMDItemKind == ’Markdown’ || kMDItemKind == ’Pages 一般書類’”) of me) as list –Caution! this parameter is *localized*

–フルパスとファイル名のペアの2D Listを作成
set newList to {}
repeat with i in aResList
  set j to contents of i
  
set aStr to (current application’s NSString’s stringWithString:j)
  
set aFileName to aStr’s lastPathComponent()
  
set the end of newList to {aStr, aFileName}
end repeat

–番号順にソート
set sortIndexes to {1} –Key Item id: begin from 0, Sort by filename
set sortOrders to {true}
set sortTypes to {“compare:”}
set resList to (current application’s SMSForder’s subarraysIn:(newList) sortedByIndexes:sortIndexes ascending:sortOrders sortTypes:sortTypes |error|:(missing value)) as list
if resList = {} then return –No Result

–ソートした順番にMarkdownファイル/Pages書類ファイルをオープンしてデスクトップにPDF生成してクローズ
repeat with i in newList
  copy i to {fullPath, aFileName}
  
  
set apFile to (POSIX file (fullPath as string))
  
set anAlias to apFile as alias
  
set aFileName to aFileName as string
  
  
if aFileName ends with “.md” then
    exportFromMacDown(anAlias) of me –Markdown
  else if aFileName ends with “.pages” then
    exportFromPages(anAlias) of me –Pages
  end if
end repeat

–指定のPagesファイル(alias)をデスクトップ上にPDFで書き出し
on exportFromPages(anAlias)
  tell application “Finder”
    set aName to name of anAlias
  end tell
  
  
set dtPath to (path to desktop) as string
  
set outPath to dtPath & aName & “.pdf”
  
  
tell application “Pages”
    close every document without saving
    
open anAlias
    
export document 1 to file outPath as PDF with properties {image quality:Best}
    
close every document without saving
  end tell
end exportFromPages

–指定のMacDownファイル(alias)をデスクトップ上にPDFで書き出し
on exportFromMacDown(anAlias)
  tell application “MacDown”
    open {anAlias}
  end tell
  
  
tell current application
    delay 1 –ここの時間待ちが少ないと画像抜けが発生?
  end tell
  
macDownForceSave() of me
  
  
tell application “MacDown”
    close every document without saving
  end tell
end exportFromMacDown

–注意!! ここでGUI Scriptingを使用。バージョンが変わったときにメニュー階層などの変更があったら書き換え
on macDownForceSave()
  activate application “MacDown”
  
tell application “System Events”
    tell process “MacDown”
      – File > Export > PDF
      
click menu item 2 of menu 1 of menu item 14 of menu 1 of menu bar item 3 of menu bar 1
      
      
–Go to Desktop Folder
      
keystroke “d” using {command down}
      
      
–Save Button on Sheet
      
click button 1 of sheet 1 of window 1
    end tell
  end tell
end macDownForceSave

–Spotlight Libの内容を引っ張り出してきた
on spotlightSearch(origPOSIXpath, aCondition)
  
  
set searchRes to {} –initialize
  
  
initiateSearchForFullPath(aCondition, origPOSIXpath) –Predicate & Scope Directory
  
  
–Waiting for the result
  
repeat while searchRes = {}
    current application’s NSThread’s sleepForTimeInterval:(“0.001″ as real) –delay 0.001
  end repeat
  
  
set anObj to searchRes’s firstObject() –Pick up the first one for test
  
if anObj = missing value then return {} –No Result
  
  
–set anAttrList to anObj’s attributes() –”mdls” attributes
  
–>  (NSArray) {”kMDItemContentTypeTree”, “kMDItemContentType”, “kMDItemPhysicalSize”, …}
  
  
set resArray to {}
  
repeat with anItem in my searchRes
    set j to contents of anItem
    
set aPath to (j’s valueForAttribute:“kMDItemPath”) as string
    
set the end of resArray to aPath
  end repeat
  
  
return resArray
end spotlightSearch

on initiateSearchForFullPath(aQueryStrings, origPath)
  
  
set aSearch to current application’s NSMetadataQuery’s alloc()’s init()
  
  
current application’s NSNotificationCenter’s defaultCenter()’s addObserver:(me) selector:“queryDidUpdate:” |name|:(current application’s NSMetadataQueryDidUpdateNotification) object:aSearch
  
current application’s NSNotificationCenter’s defaultCenter()’s addObserver:(me) selector:“initalGatherComplete:” |name|:(current application’s NSMetadataQueryDidFinishGatheringNotification) object:aSearch
  
  
set aPredicate to current application’s NSPredicate’s predicateWithFormat:aQueryStrings
  
aSearch’s setPredicate:aPredicate
  
  
set aScope to current application’s NSArray’s arrayWithObjects:{origPath}
  
aSearch’s setSearchScopes:aScope
  
  
set sortKeys to current application’s NSSortDescriptor’s sortDescriptorWithKey:“kMDItemFSName” ascending:true
  
aSearch’s setSortDescriptors:(current application’s NSArray’s arrayWithObject:sortKeys)
  
  
aSearch’s startQuery()
  
end initiateSearchForFullPath

on queryDidUpdate:sender
  –  
end queryDidUpdate:

on initalGatherComplete:sender
  set anObject to sender’s object
  
anObject’s stopQuery()
  
current application’s NSNotificationCenter’s defaultCenter()’s removeObserver:me |name|:(current application’s NSMetadataQueryDidUpdateNotification) object:anObject
  
current application’s NSNotificationCenter’s defaultCenter()’s removeObserver:me |name|:(current application’s NSMetadataQueryDidFinishGatheringNotification) object:anObject
  
set my searchRes to anObject’s results()
end initalGatherComplete:

★Click Here to Open This Script