アラートダイアログ上にWkWebViewを配置し、その上にvis.jsによるDOT言語をGraphViz同様に表示するAppleScriptです。
GraphVizは、知る人ぞ知るフロー図やマインドマップ風の図を比較的わかりやすい記述言語(DOT)で行ったものをレンダリング表示するフリーのソフトウェアです。もともと、IC上の部品配置を最適化するためのアルゴリズムが活用されているのだとか。
ノード間を線でつないだ図(マインドマップみたいなもの)を、ノードの関連情報を記述するだけでレンダリングできるため、いろいろ便利に使ってきました。MindjetMindManagerなどのアプリケーションをAppleScriptからコントロールして表示してきたものを、GraphVizに置き換えています(MindjetMindManagerが高価な割に不甲斐ないので)。AppleScript書類内のルーチンの呼び出し関係をマインドマップで表示するAppleScriptなども使っており、こちらはまだGraphViz版を作っていませんが、いろいろ便利に使えるだろうかといったところです。
▲同じデータをGraphVizでレンダリング&表示させた実行画面
–> Download gviz_data(Script bundle with AppleScript Libraries & DOT Data)
DOTファイルをレンダリングして表示するのに、GraphvizのObjective-C版をひろってきて、その内容を適宜呼び出すようなことも検討していたのですが、これでいいじゃないですか。
GraphvizのObjective-C版をAppleScriptObjC版のアプリケーションに組み込むのが大変(プログラムがFrameworkになっているとか、表示用のビューをWindowに乗せればそれでおしまい、という風にはなっていない)。
WkWebViewを1枚ウィンドウ上に貼り付けて、JavaScriptを実行。PDFに書き出すことさえ考えなければ、これで問題ないでしょう。そう、PDF出力することを考えなければ…………。あとは、Mac App Storeに出すときにこうした構造のアプリケーションで大丈夫なのかが疑問です。ただ、iOSでこうしたWebView+JavaScriptの「ガワアプリ」と言われるものが多数存在するという状況を鑑みますと、そんなにうるさいことを言われないのでは? という気もします。
本Scriptについては、あとはマウスのスクロールで拡大縮小するように改良できるとよいでしょう。
AppleScript名:DOT.jsでGraphvizをダイアログ上に表示 v2.scptd |
— – Created by: Takaaki Naganoya – Created on: 2020/06/20 — – Copyright © 2020 Piyomaru Software, All Rights Reserved — use AppleScript version "2.4" — Yosemite (10.10) or later use framework "Foundation" use scripting additions use webD : script "webDialogLib" property NSString : a reference to current application’s NSString set aDot to choose file of type {"com.omnigroup.foreign-types.graphviz-dot"} set aData to read aDot as «class utf8» –https://visjs.github.io/vis-graph3d/docs/graph3d/index.html set myStr to "<!DOCTYPE html> <html lang=\"ja\"> <head> <meta charset=\"utf-8\"> <title>Vue.js-Viz.js</title> <script src=\"https://cdn.jsdelivr.net/npm/vue@2.6.10/dist/vue.js\"></script> <script type=\"text/javascript\" src=\"https://unpkg.com/viz.js@1.8.0\"></script> <style> </style> </head> <body> <div class=\"container\"> <div id=\"graph\"> <div class=\"write\"> </div> <div class=\"out\"> <div class=\"graph\" v-html=\"svg\"></div> </div> </div> </div> </body> <script> new Vue({ el: ’#graph’, data: { input: `%@`, }, computed: { svg: function() { return Viz(this.input, { format: ’svg’ }); }, }, }); </script> </html>" set aString to current application’s NSString’s stringWithFormat_(myStr, aData) as string set paramObj to {myMessage:"viz.js Test", mySubMessage:"This is a viz.js test", htmlStr:aString, jsDelimiters:{"<script>", "</script>"}, viewSize:{1700, 400}} webD’s displayWebDialog(paramObj) |