NSAlertのアラートダイアログ上にGoogleChartsを用いたGeoChartを表示するAppleScriptです。
Geo Chartに表示されている地図の上でマウスカーソルを移動させると、Chartが反応してデータ表示を行います。
本Scriptに掲載しているAPI KeyはGoogleに掲載されているサンプル用のものであり、サンプルデータの表示以外には使用できません。Google開発者アカウントを取得し、API Keyを取得して記入しておく必要があります。
AppleScript名:アラートダイアログ上にWebViewでGoogle Chartを表示(Geo Chart 1).scptd |
— – Created by: Takaaki Naganoya – Created on: 2019/03/02 — – Copyright © 2019 Piyomaru Software, All Rights Reserved — use AppleScript version "2.4" — Yosemite (10.10) or later use framework "Foundation" use framework "AppKit" use framework "WebKit" use scripting additions property |NSURL| : a reference to current application’s |NSURL| property NSAlert : a reference to current application’s NSAlert property NSArray : a reference to current application’s NSArray property NSString : a reference to current application’s NSString property NSButton : a reference to current application’s NSButton property NSBundle : a reference to current application’s NSBundle property WKWebView : a reference to current application’s WKWebView property WKUserScript : a reference to current application’s WKUserScript property NSURLRequest : a reference to current application’s NSURLRequest property NSRunningApplication : a reference to current application’s NSRunningApplication property NSUTF8StringEncoding : a reference to current application’s NSUTF8StringEncoding property WKUserContentController : a reference to current application’s WKUserContentController property WKWebViewConfiguration : a reference to current application’s WKWebViewConfiguration property WKUserScriptInjectionTimeAtDocumentEnd : a reference to current application’s WKUserScriptInjectionTimeAtDocumentEnd property returnCode : 0 property aBrowserAgentRes : "" set mapsAPIKey to "AIzaSyD-9tSrke72PouQMnMX-a7eZSW0jkFMBWY" –for demonstration only my performSelectorOnMainThread:"getSafariUserAgentString:" withObject:(missing value) waitUntilDone:true –Sample Data set aList to {{"Country", "Popularity"}, ¬ {"Germany", 200}, ¬ {"United States", 300}, ¬ {"Brazil", 400}, ¬ {"Canada", 500}, ¬ {"France", 600}, ¬ {"RU", 700}} set aJsonArrayStr to array2DToJSONArray(aList) of me –Map Template HTML set myStr to "<!DOCTYPE html> <html lang=\"UTF-8\"> <head> <script type=\"text/javascript\" src=\"https://www.gstatic.com/charts/loader.js\"></script> <script type=\"text/javascript\"> function drawRegionsMap() { var options = {}; var chart = new google.visualization.GeoChart(document.getElementById(’regions_div’)); chart.draw(data, options); }; </script> </head> <body> <div id=\"regions_div\" style=\"width: 900px; height: 500px;\"></div> </body> </html>" set aString to NSString’s stringWithFormat_(myStr, mapsAPIKey, aJsonArrayStr) as string set paramObj to {myMessage:"Google GeoChart Test", mySubMessage:"This is a simple GeoChart using google charts", htmlStr:aString} –my browseStrWebContents:paramObj –for debug my performSelectorOnMainThread:"browseStrWebContents:" withObject:(paramObj) waitUntilDone:true on browseStrWebContents:paramObj set aMainMes to myMessage of paramObj set aSubMes to mySubMessage of paramObj set htmlString to (htmlStr of paramObj) set aWidth to 920 set aHeight to 520 –WebViewをつくる set aConf to WKWebViewConfiguration’s alloc()’s init() –指定HTML内のJavaScriptをFetch set jsSource to pickUpFromToStr(htmlString, "<script type=\"text/javascript\">", "</script>") of me set userScript to WKUserScript’s alloc()’s initWithSource:jsSource injectionTime:(WKUserScriptInjectionTimeAtDocumentEnd) forMainFrameOnly:true set userContentController to WKUserContentController’s alloc()’s init() userContentController’s addUserScript:(userScript) aConf’s setUserContentController:userContentController set aWebView to WKWebView’s alloc()’s initWithFrame:(current application’s NSMakeRect(0, 0, aWidth, aHeight)) configuration:aConf aWebView’s setNavigationDelegate:me aWebView’s setUIDelegate:me aWebView’s setTranslatesAutoresizingMaskIntoConstraints:true aWebView’s setCustomUserAgent:(my aBrowserAgentRes) set bURL to |NSURL|’s fileURLWithPath:(POSIX path of (path to me)) aWebView’s loadHTMLString:htmlString baseURL:(bURL) — set up alert set theAlert to NSAlert’s alloc()’s init() tell theAlert its setMessageText:aMainMes its setInformativeText:aSubMes its addButtonWithTitle:"OK" –its addButtonWithTitle:"Cancel" its setAccessoryView:aWebView set myWindow to its |window| end tell — show alert in modal loop NSRunningApplication’s currentApplication()’s activateWithOptions:0 my performSelectorOnMainThread:"doModal:" withObject:(theAlert) waitUntilDone:true –Stop Web View Action set bURL to |NSURL|’s URLWithString:"about:blank" set bReq to NSURLRequest’s requestWithURL:bURL aWebView’s loadRequest:bReq if (my returnCode as number) = 1001 then error number -128 end browseStrWebContents: on doModal:aParam set (my returnCode) to (aParam’s runModal()) as number end doModal: on viewDidLoad:aNotification return true end viewDidLoad: on fetchJSSourceString(aURL) set jsURL to |NSURL|’s URLWithString:aURL set jsSourceString to NSString’s stringWithContentsOfURL:jsURL encoding:(NSUTF8StringEncoding) |error|:(missing value) return jsSourceString end fetchJSSourceString on pickUpFromToStr(aStr as string, s1Str as string, s2Str as string) set a1Offset to offset of s1Str in aStr if a1Offset = 0 then return false set bStr to text (a1Offset + (length of s1Str)) thru -1 of aStr set a2Offset to offset of s2Str in bStr if a2Offset = 0 then return false set cStr to text 1 thru (a2Offset – (length of s2Str)) of bStr return cStr as string end pickUpFromToStr –リストを任意のデリミタ付きでテキストに on retArrowText(aList, aDelim) set aText to "" set curDelim to AppleScript’s text item delimiters set AppleScript’s text item delimiters to aDelim set aText to aList as text set AppleScript’s text item delimiters to curDelim return aText end retArrowText on array2DToJSONArray(aList) set anArray to current application’s NSMutableArray’s arrayWithArray:aList set jsonData to current application’s NSJSONSerialization’s dataWithJSONObject:anArray options:(0 as integer) |error|:(missing value) –0 is set resString to NSString’s alloc()’s initWithData:jsonData encoding:(NSUTF8StringEncoding) return resString end array2DToJSONArray –Safariと同じUser Agentの文字列を取得する on getSafariUserAgentString:anObject set aBundle to NSBundle’s bundleWithIdentifier:"com.apple.Safari" set aVer to (aBundle’s infoDictionary()’s objectForKey:"CFBundleShortVersionString") as text –> "9.0.2" set aBuildNo to (aBundle’s infoDictionary()’s objectForKey:"CFBundleVersion") as text –> "11601.3.6" set {v1, v2, v3} to parseVersionNumber(aBuildNo) of me set aV1 to NSString’s stringWithString:v1 set bV1 to aV1’s substringFromIndex:2 –3 characters from tail –????? –> "601" set bStr to retStrFromArrayWithDelimiter({bV1, v2, v3}, ".") of me set aWebView to WebView’s alloc()’s init() set aRes to (aWebView’s stringByEvaluatingJavaScriptFromString:"navigator.userAgent") as text –> "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_2) AppleWebKit/601.3.6 (KHTML, like Gecko)" set aBrowserAgentRes to (aRes & " Version/" & aVer & " Safari/" & bStr) end getSafariUserAgentString: –バージョン番号文字列からメジャーバージョンを取り出し数値として返す on parseVersionNumber(a) set aStr to current application’s NSString’s stringWithString:a set aRes to (aStr’s componentsSeparatedByString:".") set bRes to aRes’s allObjects() return bRes as list end parseVersionNumber –リストを指定デリミタをはさんでテキスト化 on retStrFromArrayWithDelimiter(aList, aDelim) set anArray to NSArray’s arrayWithArray:aList set aRes to anArray’s componentsJoinedByString:aDelim return aRes as text end retStrFromArrayWithDelimiter |