20260619

【失敗作・Applescript】zshの再帰処理で検索もどき

【失敗作・Applescript】zshの再帰処理で検索もどき

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