コードからブラウザへジャンプする

2020年初の更新。

最近色々コード書いているのだが、ソースコードからHTMLファイルを生成してそれをブラウザで起動するというようなことをしたくなった。

経緯

Common LispのプロッターとしてKaiを作っており、OpenGLをラップしたCL-OpenGLを用いていたのだけれど、見た目は拡張性の問題からバックエンドを別のものへ移植しようと考えている。

実際のところ今のままでも開発は進められるのだけれど、少々機能が弱すぎるのとフォントが汚い、線の描画が弱すぎる、APIが使いにくい、OpenGLのバージョンが古すぎて参照できるドキュメントが死にすぎているなどの問題がある。

そこでバックエンドの移植を考えているのだけれど、移植先として今のところ考えているのはGRかPlotlyの2つ。

GRはGKS(Graphical Kernel System)とOpenGLをもとにしたグラフィックライブラリであり、重いがデスクトップ上で動き、デザインに関しては非常に良い。

PlotlyはWebGLをベースにしたグラフィックライブラリもといブラウザ上で動くプロッターであるが、これは基本的なプロット機能はすでに実装してあるのでCommon Lisp用のプロッターとして仕上げる場合はPlotlyとCommon Lispの間を繋ぐミドルウェアを作ることが目標になる。

そんなこんなでまずはPlotlyから着手しようと考え、Plotlyを動かすにはソースコードからブラウザを起動できる必要があり、そんなこんなで今回の記事に至ったわけである。

Python

環境はmacOSなのだが、Pythonでは以下のようなコードで実行ができる。

import webbrowser

# HTMLのファイルがある場所へのパス
path = "file://" + "/Users/komi/test/index.html"

webbrowser.open(path)

拡張子が.htmlの場合はブラウザが、これを.mdのようにしたらXcodeが開く。

ちなみに正式には使用するブラウザを指定してから実行する必要があるらしい。

import webbrowser

# MacOS
chrome_path = 'open -a /Applications/Google\ Chrome.app %s'

# Windows
# chrome_path = 'C:/Program Files (x86)/Google/Chrome/Application/chrome.exe %s'

# Linux
# chrome_path = '/usr/bin/google-chrome %s'

webbrowser.get(chrome_path).open(url)

Common Lisp

Common LispではCL-Selenium-WebDriverというのが存在するらしく、以下のリポジトリに従ってやればCommon Lispのコードからブラウザを叩けるらしい。

github.com

これについては未確認なので後日試してみる。

ただ、こいつに関しては最後のコミットが数年前なので少々不安なところである。

終わりに

GUIアプリの云々やグラフィックライブラリの諸々を調べていたところ、どうやら非常に混沌としているような印象を受けた。

パッと見、どのライブラリがどこまでカバーしているのか謎なのだけれど、とりあえずGRとPlotlyがある程度新しくて安心して使えそうなグラフィックライブラリだと思われる。

2020年も開発をがんばっていきたい。