加えて CustomJS を扱うためのツール (snjs.py
) を作成した.
Bokeh では Python のファイルのなかに文字列として JavaScript のコードを埋め込みます.でも,二種類の言語の文法が混在するのはやっかいです.
そこで,JavaScript のコードは独立したものを *.js
ファイルに関数として定義することにしました.たとえば,以下は普通の JavaScript の関数のように見えますが,本ツールを利用すると slider_on_change
という名前で,filter
と cds
という変数によって,Python のデータ構造を受け取るような CustomJS の定義として扱われます.
function slider_on_change(filter, cds) {
const [start, end] = cb_obj.value;
filter.booleans = Array.from(cds.data['date']).map(d => (start <= d && d <= end));
// Needed because of https://github.com/bokeh/bokeh/issues/7273
cds.change.emit();
}
このような定義を含んた *.js
ファイルを読み込むための API が snjs.load
関数です.たとえば,CustomJS を定義するファイルの名前が callbacks.js
ならば snjs.load('callbacks.js')
というように使います.
読み込んだ定義を利用するときは,CustomJS に渡す Python のデータ構造を渡します.このための API が snjs.bind
です.この関数の第一引数には対象となる CustomJS の関数名を指定します.ここでは *.js
のなかで宣言した関数の名前を文字列で与えます.そのあとには,指定した CustomJS に渡す Python のデータ構造を列挙します.該当する関数定義の引数に沿って与えて下さい.
たとえば,上の slider_on_change
の場合は,snjs.bind('slider_on_change', date_filter, data_source)
のように指定します.
snjs.bind
は CustomJS を返すので,それをウィジェットのコールバックとして指定することができます.