20260611

【Adobe Font Development Kit for OpenType】tx テキストダンプHTML表示・ヘルパースクリプト

【Adobe Font Development Kit for OpenType】tx テキストダンプHTML表示・ヘルパースクリプト

NOTE記事一覧ですnote.com
 

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

TextダンプHTML.applescript.scpt
ソース
001#!/usr/bin/env osascript
002#coding: utf-8
003----+----1----+----2----+-----3----+----4----+----5----+----6----+----7
004(*
005AFDKO を先にインストール済みの必要があります
006https://note.com/quicktimer/n/nef5d603f562c
007
008ヘルプ
009 "${HOME}/Library/Python/3.12/bin/tx" -h
010 -->proofpdf
011https://adobe-type-tools.github.io/afdko/AFDKO-Overview.html#22-proofing
012
013com.cocolog-nifty.quicktimer.icefloe *)
014----+----1----+----2----+-----3----+----4----+----5----+----6----+----7
015use AppleScript version "2.8"
016use framework "Foundation"
017use framework "AppKit"
018use framework "UniformTypeIdentifiers"
019use scripting additions
020property refMe : a reference to current application
021
022#################
023##設定項目
024set strSaveExtension to ("html") as text
025
026
027#################
028##
029set strCommandText to ("/usr/bin/which python3") as text
030try
031   do shell script strCommandText
032on error
033   return "python3未インストール"
034end try
035#################
036##
037set appFileManager to refMe's NSFileManager's defaultManager()
038set ocidHomeDirURL to appFileManager's homeDirectoryForCurrentUser()
039set ocidSaveDirPathURL to ocidHomeDirURL's URLByAppendingPathComponent:("Sites/FontList") isDirectory:(true)
040set ocidAttrDict to refMe's NSMutableDictionary's alloc()'s init()
041ocidAttrDict's setValue:(493) forKey:(refMe's NSFilePosixPermissions)
042set listBoolMakeDir to appFileManager's createDirectoryAtURL:(ocidSaveDirPathURL) withIntermediateDirectories:true attributes:(ocidAttrDict) |error|:(reference)
043
044#################
045##バイナリーへのパス
046set appFileManager to refMe's NSFileManager's defaultManager()
047set ocidURLsArray to (appFileManager's URLsForDirectory:(refMe's NSLibraryDirectory) inDomains:(refMe's NSUserDomainMask))
048set ocidLibraryDirPathURL to ocidURLsArray's firstObject()
049set ocidBinFilePathURL to ocidLibraryDirPathURL's URLByAppendingPathComponent:("Python/3.12/bin/tx") isDirectory:(false)
050set strBinFilePath to ocidBinFilePathURL's |path|() as text
051
052#################
053## ダイアログ関連
054set strName to (name of current application) as text
055if strName is "osascript" then
056   tell application "Finder" to activate
057else
058   tell current application to activate
059end if
060
061tell application "Finder"
062   set aliasDefaultLocation to (path to fonts folder from user domain) as alias
063end tell
064set listUTI to {"public.truetype-ttf-font", "public.opentype-font"} as list
065set strPromptText to "フォントファイルを選んでください" as text
066set strMes to "選んでください" as text
067set aliasFilePath to (choose file strMes with prompt strPromptText default location (aliasDefaultLocation) of type listUTI without invisibles, multiple selections allowed and showing package contents) as alias
068
069####ファイルパス
070set strFilePath to (POSIX path of aliasFilePath) as text
071set ocidFilePathStr to refMe's NSString's stringWithString:(strFilePath)
072set ocidFilePath to ocidFilePathStr's stringByStandardizingPath()
073set ocidFilePathURL to refMe's NSURL's alloc()'s initFileURLWithPath:(ocidFilePath) isDirectory:(false)
074set strFontsFilePath to ocidFilePathURL's absoluteString() as text
075#
076set strExtensionName to ocidFilePathURL's pathExtension() as text
077set ocidFileName to ocidFilePathURL's lastPathComponent()
078set ocidBaseFilePathURL to ocidFilePathURL's URLByDeletingPathExtension()
079set strBaseFileName to ocidBaseFilePathURL's lastPathComponent() as text
080#
081set ocidSaveBasePathURL to ocidSaveDirPathURL's URLByAppendingPathComponent:(strBaseFileName) isDirectory:(false)
082set ocidSaveFilePathURL to ocidSaveBasePathURL's URLByAppendingPathExtension:("html")
083
084
085
086#################
087#コマンド整形
088set strBinFilePath to doPathEscape(strBinFilePath)
089set strFilePath to doPathEscape(strFilePath)
090
091#リストのみ
092set strCommandText to ("PATH=\\\"$HOME/Library/Python/3.12/bin:$PATH\\\";\\\"" & strBinFilePath & "\\\" -dump -0 -y \\\"" & strFilePath & "\\\"") as text
093##
094log (return & strCommandText & return)
095#コマンド実行
096set strExecCommand to ("/bin/zsh -c \"" & strCommandText & "\"") as text
097try
098   set strResponse to (do shell script strExecCommand) as text
099   
100on error
101   log "osascript でエラーしました"
102   return false
103end try
104
105#################
106#
107set ocidTmpArrayM to refMe's NSMutableArray's alloc()'s initWithCapacity:(0)
108set ocidTmpStringM to (refMe's NSMutableString's alloc()'s initWithCapacity:(0))
109#
110set ocidResponse to refMe's NSString's stringWithString:(strResponse)
111set ocidResponseArray to ocidResponse's componentsSeparatedByString:("\r")
112#
113repeat with itemArray in ocidResponseArray
114   set boolPreFixStart to (itemArray's hasPrefix:("## Top Dict")) as boolean
115   if boolPreFixStart is true then
116      set boolStart to true as boolean
117      set ocidTmpStringM to (refMe's NSMutableString's alloc()'s initWithCapacity:(0))
118   else if boolPreFixStart is false then
119      set boolPreFixEnd to (itemArray's hasPrefix:("## Private")) as boolean
120      if boolPreFixEnd is true then
121         set boolStart to false as boolean
122         (ocidTmpArrayM's addObject:(ocidTmpStringM))
123      else
124         set boolPreFixFileName to (itemArray's hasPrefix:("## Filename")) as boolean
125         if boolPreFixFileName is false then
126            set boolPreFixDict to (itemArray's hasPrefix:("## FontDict[")) as boolean
127            if boolPreFixDict is false then
128               (ocidTmpStringM's appendString:(itemArray))
129               (ocidTmpStringM's appendString:("\n"))
130            else if boolPreFixDict is true then
131               set itemArray to (itemArray's stringByReplacingOccurrencesOfString:("## ") withString:(""))
132               (ocidTmpStringM's appendString:(itemArray))
133               (ocidTmpStringM's appendString:("\n"))
134            end if
135         end if
136      end if
137   end if
138   
139end repeat
140
141
142#################
143#
144set ocidXMLDoc to refMe's NSXMLDocument's alloc()'s init()
145(ocidXMLDoc's setDocumentContentKind:(refMe's NSXMLDocumentHTMLKind))
146# DTD付与
147set ocidDTD to refMe's NSXMLDTD's alloc()'s init()
148(ocidDTD's setName:("html"))
149(ocidXMLDoc's setDTD:(ocidDTD))
150# XML主要部分を生成
151set ocidRootElement to doMakeRootElement()
152#ボディエレメント
153set ocidBodyElement to (refMe's NSXMLElement's elementWithName:("body"))
154#ヘッダー
155set ocidHeaderElement to (refMe's NSXMLElement's elementWithName:("header"))
156set ocidAddNode to (refMe's NSXMLNode's attributeWithName:("id") stringValue:("header"))
157(ocidHeaderElement's addAttribute:(ocidAddNode))
158set ocidAddNode to (refMe's NSXMLNode's attributeWithName:("class") stringValue:("body_header"))
159(ocidHeaderElement's addAttribute:(ocidAddNode))
160(ocidBodyElement's addChild:(ocidHeaderElement))
161#アーティクル
162set ocidArticleElement to (refMe's NSXMLElement's elementWithName:("article"))
163set ocidAddNode to (refMe's NSXMLNode's attributeWithName:("id") stringValue:("article"))
164(ocidArticleElement's addAttribute:(ocidAddNode))
165set ocidAddNode to (refMe's NSXMLNode's attributeWithName:("class") stringValue:("body_article"))
166(ocidArticleElement's addAttribute:(ocidAddNode))
167(ocidBodyElement's addChild:(ocidArticleElement))
168#フッター
169set ocidFooterElement to (refMe's NSXMLElement's elementWithName:("footer"))
170set ocidAddNode to (refMe's NSXMLNode's attributeWithName:("id") stringValue:("footer"))
171(ocidFooterElement's addAttribute:(ocidAddNode))
172set ocidAddNode to (refMe's NSXMLNode's attributeWithName:("class") stringValue:("body_footer"))
173(ocidFooterElement's addAttribute:(ocidAddNode))
174#リンク付与(不要なら削除可)
175set ocidAElement to (refMe's NSXMLElement's elementWithName:("a"))
176set ocidAddNode to (refMe's NSXMLNode's attributeWithName:("href") stringValue:("https://note.com/search?context=note&q=from%3A%40quicktimer%20&sort=new"))
177(ocidAElement's addAttribute:(ocidAddNode))
178set ocidAddNode to (refMe's NSXMLNode's attributeWithName:("target") stringValue:("_blank"))
179(ocidAElement's addAttribute:(ocidAddNode))
180set strContents to ("AppleScriptで生成しました") as text
181(ocidAElement's setStringValue:(strContents))
182(ocidFooterElement's addChild:(ocidAElement))
183(ocidBodyElement's addChild:(ocidFooterElement))
184
185log "HTMLヘッダー部終了"
186##############################
187# TABLE コンテンツ部分生成開始
188##############################
189#【table】
190set ocidTableElement to (refMe's NSXMLElement's elementWithName:("table"))
191set ocidAddNode to (refMe's NSXMLNode's attributeWithName:("summary") stringValue:("ADKFOリスト"))
192(ocidTableElement's addAttribute:(ocidAddNode))
193
194########################
195#【caption】
196set ocidCaptionElement to (refMe's NSXMLElement's elementWithName:("caption"))
197(ocidCaptionElement's setStringValue:(strFontsFilePath))
198(ocidTableElement's addChild:(ocidCaptionElement))
199########################
200#【colgroup】
201set ocidColgroupElement to (refMe's NSXMLElement's elementWithName:("colgroup"))
202#テーブルのタイトル部
203set listColName to {"行番号", "キー名", "値"} as list
204set listColID to {"liineNO", "KeyName", "Value"} as list
205#項目数を取得して
206set numCntCol to (count of listColName) as integer
207#タイトル部の数だけ繰り返し
208repeat with itemNo from 1 to numCntCol by 1
209   set strItemName to (item itemNo of listColName) as text
210   #【col】col生成
211   set ocidAddElement to (refMe's NSXMLElement's elementWithName:("col"))
212   set ocidAddNode to (refMe's NSXMLNode's attributeWithName:("title") stringValue:(strItemName))
213   (ocidAddElement's addAttribute:(ocidAddNode))
214   (ocidColgroupElement's addChild:(ocidAddElement))
215end repeat
216#テーブルエレメントに追加
217(ocidTableElement's addChild:(ocidColgroupElement))
218
219########################
220#【thead】
221set ocidTheadElement to (refMe's NSXMLElement's elementWithName:("thead"))
222#TR
223set ocidTrElement to (refMe's NSXMLElement's elementWithName:("tr"))
224#項目数を取得して
225set numCntCol to (count of listColName) as integer
226#タイトル部の数だけ繰り返し
227repeat with itemNo from 1 to numCntCol by 1
228   set strItemName to (item itemNo of listColName) as text
229   set strColID to (item itemNo of listColID) as text
230   #【col】col生成
231   set ocidThElement to (refMe's NSXMLElement's elementWithName:("th"))
232   set ocidAddNode to (refMe's NSXMLNode's attributeWithName:("title") stringValue:(strItemName))
233   (ocidThElement's addAttribute:(ocidAddNode))
234   set ocidAddNode to (refMe's NSXMLNode's attributeWithName:("id") stringValue:(strColID))
235   (ocidThElement's addAttribute:(ocidAddNode))
236   (ocidThElement's setStringValue:(strItemName))
237   #
238   (ocidTrElement's addChild:(ocidThElement))
239end repeat
240#TRをTHEADに入れる
241(ocidTheadElement's addChild:(ocidTrElement))
242#THEADをテーブルにセット
243(ocidTableElement's addChild:(ocidTheadElement))
244
245log "THEAD部終了"
246########################
247#【tbody】
248set ocidTbodyElement to refMe's NSXMLElement's elementWithName:("tbody")
249
250#
251set numCntLineNO to 1 as integer
252#
253repeat with itemArray in ocidTmpArrayM
254   #
255   set ocidLineArray to (itemArray's componentsSeparatedByString:("\n"))
256   
257   #
258   repeat with itemLineArray in ocidLineArray
259      #
260      set ocidContentsArray to (itemLineArray's componentsSeparatedByString:("  "))
261      set ocidSetKey to ocidContentsArray's firstObject()
262      set ocidSetValue to ocidContentsArray's lastObject()
263      #
264      if (ocidSetKey as text) is "" then
265         set ocidSetKey to "" as text
266         set ocidSetValue to "" as text
267         set strSetCnt to (refMe's NSString's stringWithString:("  "))
268         set numCntLineNO to numCntLineNO - 1 as integer
269      else
270         set strSetCnt to numCntLineNO as text
271      end if
272      #TR
273      set ocidTrElement to (refMe's NSXMLElement's elementWithName:("tr"))
274      set ocidAddNode to (refMe's NSXMLNode's attributeWithName:("scope") stringValue:("row"))
275      (ocidTrElement's addAttribute:(ocidAddNode))
276      #TD
277      set ocidTdElement to (refMe's NSXMLElement's elementWithName:("td"))
278      set ocidAddNode to (refMe's NSXMLNode's attributeWithName:("title") stringValue:("liineNO"))
279      (ocidTdElement's addAttribute:(ocidAddNode))
280      (ocidTdElement's setStringValue:(strSetCnt))
281      (ocidTrElement's addChild:(ocidTdElement))
282      #TD
283      set ocidTdElement to (refMe's NSXMLElement's elementWithName:("td"))
284      set ocidAddNode to (refMe's NSXMLNode's attributeWithName:("title") stringValue:("KeyName"))
285      (ocidTdElement's addAttribute:(ocidAddNode))
286      (ocidTdElement's setStringValue:(ocidSetKey))
287      (ocidTrElement's addChild:(ocidTdElement))
288      #TD
289      set ocidTdElement to (refMe's NSXMLElement's elementWithName:("td"))
290      set ocidAddNode to (refMe's NSXMLNode's attributeWithName:("title") stringValue:("Value"))
291      (ocidTdElement's addAttribute:(ocidAddNode))
292      (ocidTdElement's setStringValue:(ocidSetValue))
293      (ocidTrElement's addChild:(ocidTdElement))
294      #
295      (ocidTbodyElement's addChild:(ocidTrElement))
296      set numCntLineNO to numCntLineNO + 1 as integer
297   end repeat
298   
299end repeat
300
301
302
303############
304#TBODYをテーブルにセット
305(ocidTableElement's addChild:(ocidTbodyElement))
306##############################
307############
308#【tfoot】 TRで
309set ocidTfootElement to (refMe's NSXMLElement's elementWithName:("tfoot"))
310set ocidTrElement to (refMe's NSXMLElement's elementWithName:("tr"))
311#colspan指定して1行でセット
312set ocidThElement to (refMe's NSXMLElement's elementWithName:("th"))
313set ocidAddNode to (refMe's NSXMLNode's attributeWithName:("title") stringValue:("テーブルの終わり"))
314(ocidThElement's addAttribute:(ocidAddNode))
315set ocidAddNode to (refMe's NSXMLNode's attributeWithName:("colspan") stringValue:(numCntCol as text))
316(ocidThElement's addAttribute:(ocidAddNode))
317set ocidAddNode to (refMe's NSXMLNode's attributeWithName:("scope") stringValue:("row"))
318(ocidThElement's addAttribute:(ocidAddNode))
319(ocidThElement's setStringValue:("AFDKO Adobe Font Development Kit for OpenType"))
320#THをTRにセットして
321(ocidTrElement's addChild:(ocidThElement))
322#TRをTFOOTにセット
323(ocidTfootElement's addChild:(ocidTrElement))
324#TFOOTをテーブルにセット
325(ocidTableElement's addChild:(ocidTfootElement))
326
327##############################
328# ROOT
329##############################
330#   出来上がったテーブルをArticleエレメントにセット
331(ocidArticleElement's addChild:(ocidTableElement))
332#
333(ocidRootElement's addChild:(ocidBodyElement))
334#ROOTエレメントをXMLにセット
335ocidXMLDoc's setRootElement:(ocidRootElement)
336#読み取りやすい表示
337set ocidXMLdata to ocidXMLDoc's XMLDataWithOptions:(refMe's NSXMLNodePrettyPrint)
338
339
340
341##############################
342# 保存
343set listDone to ocidXMLdata's writeToURL:(ocidSaveFilePathURL) options:(refMe's NSDataWritingAtomic) |error|:(reference)
344if (item 1 of listDone) is true then
345   log "正常終了"
346else if (item 1 of listDone) is false then
347   log (item 2 of listDone)'s localizedDescription() as text
348   return "保存に失敗しました"
349end if
350##############################
351# 開く
352set appSharedWorkspace to refMe's NSWorkspace's sharedWorkspace()
353set boolDone to appSharedWorkspace's openURL:(ocidSaveFilePathURL)
354#
355set ocidOpenURLsArray to (refMe's NSMutableArray's alloc()'s init())
356(ocidOpenURLsArray's addObject:(ocidSaveDirPathURL))
357appSharedWorkspace's activateFileViewerSelectingURLs:(ocidOpenURLsArray)
358
359
360
361return "終了"
362
363
364
365##############################
366# 基本的なHTMLの構造
367##############################
368to doMakeRootElement()
369   #
370   set ocidRootElement to refMe's NSXMLElement's elementWithName:("html")
371   set ocidAddNode to refMe's NSXMLNode's attributeWithName:("lang") stringValue:("ja")
372   ocidRootElement's addAttribute:(ocidAddNode)
373   #
374   set ocidHeadElement to refMe's NSXMLElement's elementWithName:("head")
375   #
376   set ocidAddElement to refMe's NSXMLElement's elementWithName:("title")
377   ocidAddElement's setStringValue:("ファイル比較")
378   ocidHeadElement's addChild:(ocidAddElement)
379   # http-equiv
380   set ocidAddElement to refMe's NSXMLElement's elementWithName:("meta")
381   set ocidAddNode to refMe's NSXMLNode's attributeWithName:("http-equiv") stringValue:("Content-Type")
382   ocidAddElement's addAttribute:(ocidAddNode)
383   set ocidAddNode to refMe's NSXMLNode's attributeWithName:("content") stringValue:("text/html; charset=UTF-8")
384   ocidAddElement's addAttribute:(ocidAddNode)
385   ocidHeadElement's addChild:(ocidAddElement)
386   #
387   set ocidAddElement to refMe's NSXMLElement's elementWithName:("meta")
388   set ocidAddNode to refMe's NSXMLNode's attributeWithName:("http-equiv") stringValue:("Content-Style-Type")
389   ocidAddElement's addAttribute:(ocidAddNode)
390   set ocidAddNode to refMe's NSXMLNode's attributeWithName:("content") stringValue:("text/css")
391   ocidAddElement's addAttribute:(ocidAddNode)
392   ocidHeadElement's addChild:(ocidAddElement)
393   #
394   set ocidAddElement to refMe's NSXMLElement's elementWithName:("meta")
395   set ocidAddNode to refMe's NSXMLNode's attributeWithName:("http-equiv") stringValue:("Content-Script-Type")
396   ocidAddElement's addAttribute:(ocidAddNode)
397   set ocidAddNode to refMe's NSXMLNode's attributeWithName:("content") stringValue:("text/javascript")
398   ocidAddElement's addAttribute:(ocidAddNode)
399   ocidHeadElement's addChild:(ocidAddElement)
400   #
401   set ocidAddElement to refMe's NSXMLElement's elementWithName:("meta")
402   set ocidAddNode to refMe's NSXMLNode's attributeWithName:("name") stringValue:("viewport")
403   ocidAddElement's addAttribute:(ocidAddNode)
404   set ocidAddNode to refMe's NSXMLNode's attributeWithName:("content") stringValue:("width=720")
405   ocidAddElement's addAttribute:(ocidAddNode)
406   ocidHeadElement's addChild:(ocidAddElement)
407   #
408   set ocidAddElement to refMe's NSXMLElement's elementWithName:("style")
409   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 }} thead td {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 td { word-wrap: break-word;max-width: 360px;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 p { margin-block-end: 2px; margin-block-start: 2px;} 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; } 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 }}")
410   ocidHeadElement's addChild:(ocidAddElement)
411   #
412   ocidRootElement's addChild:(ocidHeadElement)
413   #   
414   return ocidRootElement
415end doMakeRootElement
416
417########################
418#パスのエスケープ
419to doPathEscape(strFilePath)
420   set strFilePath to strFilePath as text
421   set ocidFilePathStr to refMe's NSString's stringWithString:(strFilePath)
422   set ocidFilePath to ocidFilePathStr's stringByStandardizingPath()
423   set ocidFilePathURL to refMe's NSURL's fileURLWithPath:(ocidFilePath) isDirectory:(false)
424   set listEscChar to {"\\", "\"", "$", "`"} as list
425   repeat with itemEscChar in listEscChar
426      set ocidFilePath to (ocidFilePath's stringByReplacingOccurrencesOfString:(itemEscChar) withString:("\\\\\\" & itemEscChar & ""))
427   end repeat
428   set ocidFilePath to (ocidFilePath's stringByReplacingOccurrencesOfString:("!") withString:("\\\"'!'\\\""))
429   
430   return ocidFilePath
431end doPathEscape
AppleScriptで生成しました