sclass WaveSurfer { S id = "wavesurfer-" + aGlobalID(); // id of container element S containerSelector; S varName; // name of variable for wavesurfer instance new MapSO options; S audioURL; S headStuff() { ret hscript("https://unpkg.com/wavesurfer.js"); } S js_init() { if (empty(containerSelector)) containerSelector = "#" + id; options.put(container := containerSelector); ret jsDollarVars([[ var $waveSurfer = WaveSurfer.create($options); ]], +options, waveSurfer := JS(varName)); } S js_loadAudio(S url) { ret jsDollarVars([[ $waveSurfer.load(url); ]], +url, waveSurfer := JS(varName)); } S completeHTML(S audioURL) { ret headStuff() + hjs(linesLL(js_init(), js_loadAudio(audioURL))); } }