世界地図のSVGをHTMLReader.frameworkでparseして、目的のノードに塗り色の指定を行い、WkWebView上で表示するAppleScriptです。
–> Download countrySel(Code-Signed AppleScript applet executable. Its icon is customized version by Script Debbuger)
▲いかにもなメルカトル図法の世界地図。極地に行くほど巨大に表現される。国によっては国土が小さいために色を変えてもこの縮尺だとわからないことも
SVGをparseするのにXML Parser系のFrameworkを軒並み試してみたのですが、所定の要素を掘り進んでいくまでは楽にできるものの、検索先のnodeまで行って属性値を書き換えたあとでrootまで戻り、属性値を書き換えたXML全体を文字列化するような機能を備えたものは見つかりませんでした。
この手の処理で圧倒的に便利なのがHTMLReader.framework。書き換え要素を検索して、書き換えたあとにrootまで戻り、Document全体を文字列化して返すような処理が楽勝です。この手の処理が楽にできるプログラムは、自分が知っているかぎりではこれだけです。
本ScriptはmacOS 10.15.1上で作って試してみましたが、驚いたことに、アプリケーション書き出ししたときに、Apple純正のランタイムだとAppleScriptアプレット内にバンドルしたフレームワークにアクセスできなくなっていました。
セキュリティを強化したいのは理解できますが、いささかやりすぎではないでしょうか。この先、Script Debuggerを用いて書き出したランタイムまで実行できなくなったとしたらXcode上で作らないと実行できなくなってしまうことでしょう。いささかやりすぎのようにも思えます。
Script Debuggerから「Application(Apple)」で書き出すと、Frameworkにアクセスできないんだか、WkWebViewにアクセスできないんだか不明ですが、macOS 10.15上では地図が表示できません。
▲Script Debugger上でアプレット書き出しするさいに、Applicaion(Enhanced)で書き出さないとバンドル内のフレームワーク呼び出しができなかった。Script Debuggerがないと手も足も出ない
▲ISO国コードから選択。「JP」を選ぶと日本が、「AU」を選ぶとオーストラリアが赤く表示される
▲SVGの世界地図をテキストエディタでオープンしたところ
AppleScript名:SVGの要素を走査するじっけん v2.scptd |
— – Created by: Takaaki Naganoya – Created on: 2019/11/19 — – Copyright © 2019 Piyomaru Software, All Rights Reserved — use AppleScript version "2.4" use scripting additions use framework "Foundation" use framework "HTMLReader" –https://github.com/nolanw/HTMLReader use webDialog : script "webViewLib" property NSString : a reference to current application’s NSString property HTMLDocument : a reference to current application’s HTMLDocument property textArray : missing value property anError : missing value –Choose Target Country set isoCountry to (current application’s NSLocale’s ISOCountryCodes()) as list set cRes to choose from list isoCountry with prompt "Select Target Country" set targetCountry to contents of first item of cRes –Load SVG World map in this bundle set mePath to ((path to me) as string) & "Contents:Resources:world-2.svg" set aData to read (mePath as alias) set aHTML to current application’s HTMLDocument’s documentWithString:(aData as string) set eList to (aHTML’s nodesMatchingSelector:"path") as list set fList to (aHTML’s nodesMatchingSelector:"path")’s valueForKeyPath:"attributes.id" –Search Target Country set aRes to (fList)’s indexOfObject:(targetCountry) if (aRes = current application’s NSNotFound) or (aRes > 9.99999999E+8) then error "Target country not found" end if set aRes to aRes + 1 — (Cocoa array index begins from 0, AppleScript is 1) –Rewrite target country’s fill color on SVG set tmpNode to contents of item aRes of (eList) (tmpNode’s setObject:"Red" forKeyedSubscript:"fill") –Change Target Country’s fill color set svgCon to (tmpNode’s |document|()’s serializedFragment()) as string –HTMLReaderはこういう処理ができるところが好き –Alert Dialog上でSVGを表示 dispWebViewByString(svgCon, "This is " & targetCountry, "This is your indicated country by 2 character country code") of webDialog |
アラートダイアログ上のWebViewに世界地図を表示 v2b – AppleScriptの穴 says:
[…] 昨日のものがあくまでSVGのParseと表示が目的の試作品であったのに対し、本Scriptは連続してポップアップメニューから対象を選んで表示するというものです。 […]