20260619

【Applescript】Findコマンドの結果をHTML表示

【Applescript】Findコマンドの結果をHTML表示

NOTE記事一覧ですnote.com

【Safari・FireFox用Script Editorで開く】 |

zshで検索もどき.applescript.scpt
ソース
001#!/usr/bin/env osascript
002#coding: utf-8
003----+----1----+----2----+-----3----+----4----+----5----+----6----+----7--
004(*
005失敗作
006zshの再帰検索機能を使って拡張子検索
007結果をHTML表示
008コマンドの戻り値を色々しないと
009意図した結果にならないから
010高速動作するのでポイント高いけど
011大人しくfindコマンド使った方が好いに決まっている
012
013出力のHTMLは、起動時に削除される項目=テンポラリーアイテムに作成するので
014使い捨て(次回の起動時に自動削除)
015
016
017
018com.cocolog-nifty.quicktimer.icefloe *)
019----+----1----+----2----+-----3----+----4----+----5----+----6----+----7--
020use AppleScript version "2.8"
021use framework "Foundation"
022use framework "AppKit"
023use framework "UniformTypeIdentifiers"
024use framework "CoreFoundation"
025use scripting additions
026
027property refMe : a reference to current application
028
029
030#############################
031#ダイアログ
032set strMsg to ("フォルダを選択してください") as text
033set strPrompt to ("フォルダを選択してください" & return & "選択したフォルダを再回帰的に検索します") as text
034set appFileManager to refMe's NSFileManager's defaultManager()
035set ocidURLsArray to (appFileManager's URLsForDirectory:(refMe's NSDesktopDirectory) inDomains:(refMe's NSUserDomainMask))
036set ocidDesktopDirPathURL to ocidURLsArray's firstObject()
037set aliasDefaultLocation to (ocidDesktopDirPathURL's absoluteURL()) as alias
038try
039   tell application "Finder"
040      tell application "SystemUIServer"
041         activate
042         set aliasDirPath to (choose folder strMsg with prompt strPrompt default location aliasDefaultLocation with invisibles and showing package contents without multiple selections allowed) as alias
043      end tell
044   end tell
045on error strErrMsg number numErrNo
046   log strErrMsg & numErrNo
047   return false
048end try
049set strDirPath to (POSIX path of aliasDirPath) as text
050set ocidDirPathStr to refMe's NSString's stringWithString:(strDirPath)
051set ocidDirPath to ocidDirPathStr's stringByStandardizingPath()
052set ocidDirPath to ocidDirPath's stringByExpandingTildeInPath()
053set ocidDirPathURL to refMe's NSURL's fileURLWithPath:(ocidDirPath) isDirectory:(true)
054
055
056##############################
057#   ダイアログ
058set strIconFilePath to ("/System/Library/PrivateFrameworks/AOSUI.framework/Versions/A/Resources/pref_notes.icns") as text
059set aliasIconFilePath to (POSIX file strIconFilePath) as alias
060set strMsg to ("拡張子を入力してください" & return & "拡張子で検索します" & return & "『.』ドット不要") as text
061set strTitle to ("入力してください") as text
062set strOK to ("実行") as text
063set strCancel to ("キャンセル") as text
064set listBotton to {strOK, strCancel} as list
065set strDefaultAnswer to ("文字入力X文字程度") as text
066try
067   tell application "System Events"
068      activate
069      set recordResult to (display dialog strMsg with title strTitle default answer strDefaultAnswer buttons listBotton default button strOK cancel button strCancel with icon aliasIconFilePath giving up after 20 without hidden answer) as record
070   end tell
071on error strErrMsg number numErrNo
072   log strErrMsg & numErrNo
073   return false
074end try
075set strResponseButton to (button returned of recordResult) as text
076set boolGaveUp to (gave up of recordResult) as boolean
077if boolGaveUp is true then
078   log "時間切れ"
079   return false
080else if strResponseButton is strOK then
081   set strReturnedText to (text returned of recordResult) as text
082end if
083
084#処理開始時間
085set ocidStart to refMe's CFAbsoluteTimeGetCurrent()
086
087
088##############################
089#戻り値整形
090set ocidOrgStrings to (refMe's NSString's stringWithString:(strReturnedText))
091#NFC処理
092set ocidOrgStringsNFC to ocidOrgStrings's precomposedStringWithCanonicalMapping()
093#改行をLFに強制
094set ocidReplacedStrings to (ocidOrgStringsNFC's stringByReplacingOccurrencesOfString:(return & linefeed) withString:(linefeed))
095set ocidReplacedStrings to (ocidReplacedStrings's stringByReplacingOccurrencesOfString:(return) withString:(linefeed))
096####戻り値を半角にする
097set ocidNSStringTransform to (refMe's NSStringTransformFullwidthToHalfwidth)
098set ocidResponseHalfwidth to (ocidReplacedStrings's stringByApplyingTransform:ocidNSStringTransform |reverse|:false)
099set ocidResponseHalfwidth to (ocidResponseHalfwidth's stringByReplacingOccurrencesOfString:(".") withString:(""))
100
101set ocidExtension to ocidResponseHalfwidth's lowercaseString()
102
103#############################
104#
105set ocidDirPath to doPathEscape(ocidDirPath)
106#相対パスの場合
107set strCmd to ("/bin/zsh -c  \"pushd \\\"" & ocidDirPath & "/\\\";/bin/ls **/*." & ocidExtension & " 2>/dev/null || true\"") as text
108
109#絶対パスの場合
110set strCmd to ("/bin/zsh -c  \"/bin/ls \\\"" & ocidDirPath & "/\\\"**/*." & ocidExtension & " 2>/dev/null || true\"") as text
111
112
113set strStdOut to (do shell script strCmd) as text
114
115#############################
116#
117set ocidStdOut to (refMe's NSString's stringWithString:(strStdOut))
118set ocidStdOut to (ocidStdOut's stringByReplacingOccurrencesOfString:(return & linefeed) withString:(linefeed))
119set ocidStdOut to (ocidStdOut's stringByReplacingOccurrencesOfString:(return) withString:(linefeed))
120set ocidPathStringArray to ocidStdOut's componentsSeparatedByString:(linefeed)
121
122#############################
123#保存先
124set appFileManager to refMe's NSFileManager's defaultManager()
125set ocidTempDirURL to appFileManager's temporaryDirectory()
126set ocidUUID to refMe's NSUUID's alloc()'s init()
127set ocidUUIDString to ocidUUID's UUIDString
128set ocidSaveDirPathURL to ocidTempDirURL's URLByAppendingPathComponent:(ocidUUIDString) isDirectory:(true)
129#
130set ocidAttrDict to refMe's NSMutableDictionary's alloc()'s init()
131ocidAttrDict's setValue:(511) forKey:(refMe's NSFilePosixPermissions)
132set listDone to appFileManager's createDirectoryAtURL:(ocidSaveDirPathURL) withIntermediateDirectories:(true) attributes:(ocidAttrDict) |error|:(reference)
133#パス
134set strFileName to "search_result.html" as text
135set ocidSaveFilePathURL to ocidSaveDirPathURL's URLByAppendingPathComponent:(strFileName) isDirectory:false
136#############################
137#
138set strTitleText to ("【Zsh】: " & ocidExtension & " :検索結果一覧") as text
139#headerに渡すエレメント
140set ocidSetHeaderElement to (refMe's NSXMLElement's elementWithName:("div"))
141set ocidH3Element to (refMe's NSXMLElement's elementWithName:("h3"))
142(ocidH3Element's setStringValue:(strTitleText))
143(ocidSetHeaderElement's addChild:(ocidH3Element))
144#footerに渡すエレメント
145set ocidSetFooterElement to (refMe's NSXMLElement's elementWithName:("div"))
146set ocidAElement to (refMe's NSXMLElement's elementWithName:("a"))
147set ocidAddNode to (refMe's NSXMLNode's attributeWithName:("href") stringValue:("https://note.com/search?context=note&q=from%3A%40quicktimer%20&sort=new"))
148(ocidAElement's addAttribute:(ocidAddNode))
149set ocidAddNode to (refMe's NSXMLNode's attributeWithName:("target") stringValue:("_blank"))
150(ocidAElement's addAttribute:(ocidAddNode))
151set strContents to ("AppleScriptで生成しました") as text
152(ocidAElement's setStringValue:(strContents))
153(ocidSetFooterElement's addChild:(ocidAElement))
154#articleに渡すエレメント
155set ocidSetArticleElement to (refMe's NSXMLElement's elementWithName:("div"))
156set ocidH5Element to (refMe's NSXMLElement's elementWithName:("h5"))
157(ocidH5Element's setStringValue:(ocidDirPathStr))
158(ocidSetArticleElement's addChild:(ocidH5Element))
159########################
160#テーブル部生成開始
161set ocidTableElement to (refMe's NSXMLElement's elementWithName:("table"))
162#【caption】
163set ocidCaptionElement to (refMe's NSXMLElement's elementWithName:("caption"))
164set strCaptionText to ((ocidExtension as text) & " : 検索結果") as text
165(ocidCaptionElement's setStringValue:(strCaptionText))
166(ocidTableElement's addChild:(ocidCaptionElement))
167#【thead】
168set ocidTheadElement to (refMe's NSXMLElement's elementWithName:("thead"))
169set ocidTrElement to (refMe's NSXMLElement's elementWithName:("tr"))
170#項目番号
171set ocidAddElement to (refMe's NSXMLElement's elementWithName:("th"))
172(ocidAddElement's setStringValue:("\"))
173(ocidTrElement's addChild:(ocidAddElement))
174#キー
175set ocidAddElement to (refMe's NSXMLElement's elementWithName:("th"))
176(ocidAddElement's setStringValue:("LINK"))
177(ocidTrElement's addChild:(ocidAddElement))
178#キー
179set ocidAddElement to (refMe's NSXMLElement's elementWithName:("th"))
180(ocidAddElement's setStringValue:("PATH"))
181(ocidTrElement's addChild:(ocidAddElement))
182#TRをTHEADにセット
183(ocidTheadElement's addChild:(ocidTrElement))
184#THEADをテーブルにセット
185(ocidTableElement's addChild:(ocidTheadElement))
186########################
187set numTotalLine to 0 as integer
188set numCntMachArray to ocidPathStringArray's |count|()
189#【tbody】
190set ocidTbodyElement to (refMe's NSXMLElement's elementWithName:("tbody"))
191#繰り返し
192repeat with numItemNo from 1 to numCntMachArray by 1
193   
194   #TRの開始
195   set ocidTrElement to (refMe's NSXMLElement's elementWithName:("tr"))
196   #項番処理
197   set ocidThElement to (refMe's NSXMLElement's elementWithName:("th"))
198   (ocidThElement's setStringValue:(numItemNo as text))
199   (ocidTrElement's addChild:(ocidThElement))
200   #リンク
201   set ocidTdElement to (refMe's NSXMLElement's elementWithName:("td"))
202   set ocidItemPathString to (ocidPathStringArray's objectAtIndex:(numItemNo - 1))
203   set strItemPathString to ocidItemPathString as text
204   set ocidAElement to (refMe's NSXMLElement's elementWithName:("a"))
205   set ocidCharSet to refMe's NSCharacterSet's URLPathAllowedCharacterSet()
206   set ocidEncString to (ocidItemPathString's stringByAddingPercentEncodingWithAllowedCharacters:(ocidCharSet))
207   
208   set ocidAddNode to (refMe's NSXMLNode's attributeWithName:("href") stringValue:(ocidEncString))
209   (ocidAElement's addAttribute:(ocidAddNode))
210   set ocidAddNode to (refMe's NSXMLNode's attributeWithName:("target") stringValue:("_blank"))
211   (ocidAElement's addAttribute:(ocidAddNode))
212   (ocidAElement's setStringValue:(strItemPathString))
213   (ocidTdElement's addChild:(ocidAElement))
214   (ocidTrElement's addChild:(ocidTdElement))
215   #パス
216   set ocidTdElement to (refMe's NSXMLElement's elementWithName:("td"))
217   set ocidINPUTElement to (refMe's NSXMLElement's elementWithName:("input"))
218   set ocidAddNode to (refMe's NSXMLNode's attributeWithName:("type") stringValue:("text"))
219   (ocidINPUTElement's addAttribute:(ocidAddNode))
220   set ocidAddNode to (refMe's NSXMLNode's attributeWithName:("readonly") stringValue:("true"))
221   (ocidINPUTElement's addAttribute:(ocidAddNode))
222   set ocidAddNode to (refMe's NSXMLNode's attributeWithName:("onclick") stringValue:("this.select();"))
223   (ocidINPUTElement's addAttribute:(ocidAddNode))
224   
225   set ocidAddNode to (refMe's NSXMLNode's attributeWithName:("value") stringValue:(strItemPathString))
226   (ocidINPUTElement's addAttribute:(ocidAddNode))
227   (ocidTdElement's addChild:(ocidINPUTElement))
228   
229   (ocidTrElement's addChild:(ocidTdElement))
230   (ocidTbodyElement's addChild:(ocidTrElement))
231end repeat
232#TBODYをテーブルにセット
233(ocidTableElement's addChild:(ocidTbodyElement))
234#【tfoot】 TRで
235set ocidTfootElement to (refMe's NSXMLElement's elementWithName:("tfoot"))
236set ocidTrElement to (refMe's NSXMLElement's elementWithName:("tr"))
237#colspan指定して1行でセット
238set ocidThElement to (refMe's NSXMLElement's elementWithName:("th"))
239set ocidAddNode to (refMe's NSXMLNode's attributeWithName:("colspan") stringValue:(3))
240(ocidThElement's addAttribute:(ocidAddNode))
241
242#
243set strContents to (" 項目数 : " & (numCntMachArray as text)) as text
244(ocidThElement's setStringValue:(strContents))
245#THをTRにセットして
246(ocidTrElement's addChild:(ocidThElement))
247#TRをTFOOTにセット
248(ocidTfootElement's addChild:(ocidTrElement))
249#TFOOTをテーブルにセット
250(ocidTableElement's addChild:(ocidTfootElement))
251#テーブルをアーティクルにセット
252(ocidSetArticleElement's addChild:(ocidTableElement))
253#<HR>
254set ocidHRElement to (refMe's NSXMLElement's elementWithName:("hr"))
255(ocidSetArticleElement's addChild:(ocidHRElement))
256set ocidTextareaElement to (refMe's NSXMLElement's elementWithName:("textarea"))
257set ocidAddNode to (refMe's NSXMLNode's attributeWithName:("readonly") stringValue:("true"))
258(ocidTextareaElement's addAttribute:(ocidAddNode))
259
260set ocidAddNode to (refMe's NSXMLNode's attributeWithName:("style") stringValue:("width: 80%;height: 360px;resize: none;box-sizing: border-box;"))
261(ocidTextareaElement's addAttribute:(ocidAddNode))
262
263
264(ocidTextareaElement's setStringValue:(ocidStdOut))
265(ocidSetArticleElement's addChild:(ocidTextareaElement))
266
267
268##############################
269#HTMLにする
270set ocidHTML to doMakeRootElement({ocidSetHeaderElement, ocidSetArticleElement, ocidSetFooterElement, strTitleText})
271##############################
272#保存
273
274#読み取りやすい表示
275set ocidXMLdata to (ocidHTML's XMLDataWithOptions:(refMe's NSXMLNodePrettyPrint))
276#保存
277set listDone to (ocidXMLdata's writeToURL:(ocidSaveFilePathURL) options:(refMe's NSDataWritingAtomic) |error|:(reference))
278set aliasFilePath to (ocidSaveFilePathURL's absoluteURL()) as alias
279
280##############################
281#【6】ブラウザで開く
282
283set strAppPath to ("/Applications/Safari.app") as text
284set ocidAppPathStr to (refMe's NSString's stringWithString:(strAppPath))
285set ocidAppPath to ocidAppPathStr's stringByStandardizingPath()
286set ocidAppPathURL to (refMe's NSURL's fileURLWithPath:(ocidAppPath) isDirectory:(false))
287set appSharedWorkspace to refMe's NSWorkspace's sharedWorkspace()
288set ocidConfig to refMe's NSWorkspaceOpenConfiguration's configuration
289(ocidConfig's setActivates:(refMe's NSNumber's numberWithBool:true))
290(ocidConfig's setHides:(refMe's NSNumber's numberWithBool:false))
291##
292set ocidOpenURLsArray to refMe's NSMutableArray's alloc()'s init()
293(ocidOpenURLsArray's addObject:(ocidSaveFilePathURL))
294##
295(appSharedWorkspace's openURLs:(ocidOpenURLsArray) withApplicationAtURL:(ocidAppPathURL) configuration:(ocidConfig) completionHandler:(missing value))
296
297
298#処理終了時間
299set ocidEnd to refMe's CFAbsoluteTimeGetCurrent()
300set strTime to (ocidEnd - ocidStart) as text
301return ("処理時間:" & strTime) as text
302
303########################
304#【ZSH用】パスのエスケープ
305to doPathEscape(strFilePath)
306   set strFilePath to strFilePath as text
307   set ocidFilePathStr to refMe's NSString's stringWithString:(strFilePath)
308   set ocidFilePath to ocidFilePathStr's stringByStandardizingPath()
309   set ocidFilePathURL to refMe's NSURL's fileURLWithPath:(ocidFilePath) isDirectory:(false)
310   set listEscChar to {"\\", "\"", "$", "`"} as list
311   repeat with itemEscChar in listEscChar
312      set ocidFilePath to (ocidFilePath's stringByReplacingOccurrencesOfString:(itemEscChar) withString:("\\\\\\" & itemEscChar & ""))
313   end repeat
314   set ocidFilePath to (ocidFilePath's stringByReplacingOccurrencesOfString:("!") withString:("\\\"'!'\\\""))
315   return ocidFilePath
316end doPathEscape
317
318##############################
319#   クリップボードの中身取り出し
320to doGetPastBoard()
321   set appPasteboard to refMe's NSPasteboard's generalPasteboard()
322   set ocidPastBoardTypeArray to appPasteboard's types()
323   set boolContain to ocidPastBoardTypeArray's containsObject:(refMe's NSStringPboardType)
324   if (boolContain as boolean) is true then
325      set ocidString to appPasteboard's stringForType:(refMe's NSStringPboardType)
326      set strDefaultAnswer to ocidString as text
327   else
328      set strDefaultAnswer to ("文字入力X文字程度") as text
329   end if
330   #ダイアログ保護のため50文字まで
331   set numCntChar to (count of every character of strDefaultAnswer) as integer
332   if numCntChar > 50 then
333      set strDefaultAnswer to (text 1 through 50 of strDefaultAnswer) as text
334   end if
335end doGetPastBoard
336
337
338
339############################################################
340# 基本的なHTMLの構造
341(*
342doMakeRootElement({argHeaderContents, argArticleContents, argFooterContents,argTitleText})
343HTMLのBODY部
344header
345article
346footerにそれぞれAddchildするデータをリストで渡す
347戻り値はRootエレメントにセットされた
348NSXMLDocumentを戻すので 保存すればOK
349*)
350############################################################
351to doMakeRootElement({argHeaderContents, argArticleContents, argFooterContents, argTitleText})
352   #XML初期化
353   set ocidXMLDoc to refMe's NSXMLDocument's alloc()'s init()
354   ocidXMLDoc's setDocumentContentKind:(refMe's NSXMLDocumentHTMLKind)
355   # DTD付与
356   set ocidDTD to refMe's NSXMLDTD's alloc()'s init()
357   ocidDTD's setName:("html")
358   ocidXMLDoc's setDTD:(ocidDTD)
359   #
360   set ocidRootElement to refMe's NSXMLElement's elementWithName:("html")
361   set ocidAddNode to refMe's NSXMLNode's attributeWithName:("lang") stringValue:("ja")
362   ocidRootElement's addAttribute:(ocidAddNode)
363   #
364   set ocidHeadElement to refMe's NSXMLElement's elementWithName:("head")
365   #
366   set ocidAddElement to refMe's NSXMLElement's elementWithName:("title")
367   ocidAddElement's setStringValue:(argTitleText)
368   ocidHeadElement's addChild:(ocidAddElement)
369   # http-equiv
370   set ocidAddElement to refMe's NSXMLElement's elementWithName:("meta")
371   set ocidAddNode to refMe's NSXMLNode's attributeWithName:("http-equiv") stringValue:("Content-Type")
372   ocidAddElement's addAttribute:(ocidAddNode)
373   set ocidAddNode to refMe's NSXMLNode's attributeWithName:("content") stringValue:("text/html; charset=UTF-8")
374   ocidAddElement's addAttribute:(ocidAddNode)
375   ocidHeadElement's addChild:(ocidAddElement)
376   #
377   set ocidAddElement to refMe's NSXMLElement's elementWithName:("meta")
378   set ocidAddNode to refMe's NSXMLNode's attributeWithName:("http-equiv") stringValue:("Content-Style-Type")
379   ocidAddElement's addAttribute:(ocidAddNode)
380   set ocidAddNode to refMe's NSXMLNode's attributeWithName:("content") stringValue:("text/css")
381   ocidAddElement's addAttribute:(ocidAddNode)
382   ocidHeadElement's addChild:(ocidAddElement)
383   #
384   set ocidAddElement to refMe's NSXMLElement's elementWithName:("meta")
385   set ocidAddNode to refMe's NSXMLNode's attributeWithName:("http-equiv") stringValue:("Content-Script-Type")
386   ocidAddElement's addAttribute:(ocidAddNode)
387   set ocidAddNode to refMe's NSXMLNode's attributeWithName:("content") stringValue:("text/javascript")
388   ocidAddElement's addAttribute:(ocidAddNode)
389   ocidHeadElement's addChild:(ocidAddElement)
390   #
391   set ocidAddElement to refMe's NSXMLElement's elementWithName:("meta")
392   set ocidAddNode to refMe's NSXMLNode's attributeWithName:("name") stringValue:("viewport")
393   ocidAddElement's addAttribute:(ocidAddNode)
394   set ocidAddNode to refMe's NSXMLNode's attributeWithName:("content") stringValue:("width=90%")
395   ocidAddElement's addAttribute:(ocidAddNode)
396   ocidHeadElement's addChild:(ocidAddElement)
397   #
398   set ocidAddElement to refMe's NSXMLElement's elementWithName:("style")
399   ocidAddElement's setStringValue:("body { margin: 10px; background-color: #FFFFFF; } table { border-spacing: 0; caption-side: top; font-family: system-ui; } thead th { border: solid 1px #666666; padding: .5ch 1ch; border-block-width: 1px 0; border-inline-width: 1px 0; &:first-of-type { border-start-start-radius: .5em } &:last-of-type { border-start-end-radius: .5em; border-inline-end-width: 1px } }tbody input {max-width: 400px;} tbody td { word-wrap: break-word;max-width: 400px;border-spacing: 0; border: solid 1px #666666; padding: .5ch 1ch; border-block-width: 1px 0; border-inline-width: 1px 0; &:last-of-type { border-inline-end-width: 1px } } tbody th { border-spacing: 0; border: solid 1px #666666; padding: .5ch 1ch; border-block-width: 1px 0; border-inline-width: 1px 0; } tbody tr:nth-of-type(odd) { background: #F2F2F2; } .kind_string { font-size: 0.75em; } .date_string { font-size: 0.5em; } .tbody_th_title{text-align: left;} tfoot th { border: solid 1px #666666; padding: .5ch 1ch; &:first-of-type { border-end-start-radius: .5em } &:last-of-type { border-end-end-radius: .5em; border-inline-end-width: 1px } }")
400   ocidHeadElement's addChild:(ocidAddElement)
401   ocidRootElement's addChild:(ocidHeadElement)
402   #   
403   #ボディエレメント
404   set ocidBodyElement to refMe's NSXMLElement's elementWithName:("body")
405   #ヘッダー
406   set ocidHeaderElement to refMe's NSXMLElement's elementWithName:("header")
407   set ocidAddNode to refMe's NSXMLNode's attributeWithName:("id") stringValue:("header")
408   ocidHeaderElement's addAttribute:(ocidAddNode)
409   set ocidAddNode to refMe's NSXMLNode's attributeWithName:("class") stringValue:("body_header")
410   ocidHeaderElement's addAttribute:(ocidAddNode)
411   ocidHeaderElement's addChild:(argHeaderContents)
412   ocidBodyElement's addChild:(ocidHeaderElement)
413   #アーティクル
414   set ocidArticleElement to refMe's NSXMLElement's elementWithName:("article")
415   set ocidAddNode to refMe's NSXMLNode's attributeWithName:("id") stringValue:("article")
416   ocidArticleElement's addAttribute:(ocidAddNode)
417   set ocidAddNode to refMe's NSXMLNode's attributeWithName:("class") stringValue:("body_article")
418   ocidArticleElement's addAttribute:(ocidAddNode)
419   ocidArticleElement's addChild:(argArticleContents)
420   ocidBodyElement's addChild:(ocidArticleElement)
421   #フッター
422   set ocidFooterElement to refMe's NSXMLElement's elementWithName:("footer")
423   set ocidAddNode to refMe's NSXMLNode's attributeWithName:("id") stringValue:("footer")
424   ocidFooterElement's addAttribute:(ocidAddNode)
425   set ocidAddNode to refMe's NSXMLNode's attributeWithName:("class") stringValue:("body_footer")
426   ocidFooterElement's addAttribute:(ocidAddNode)
427   ocidFooterElement's addChild:(argFooterContents)
428   ocidBodyElement's addChild:(ocidFooterElement)
429   #ボディをROOTエレメントにセット
430   ocidRootElement's addChild:(ocidBodyElement)
431   #ROOTをXMLにセット
432   ocidXMLDoc's setRootElement:(ocidRootElement)
433   #値を戻す
434   return ocidXMLDoc
435end doMakeRootElement
436
437
AppleScriptで生成しました