abcjs
Version:
Renderer for abc music notation
51 lines (48 loc) • 1.67 kB
JavaScript
function findNumber(klass, match, target, name) {
if (klass.indexOf(match) === 0) {
var value = klass.replace(match, '');
var num = parseInt(value, 10);
if ('' + num === value)
target[name] = num;
}
}
function createAnalysis(target, ev) {
var classes = [];
if (target.absEl.elemset) {
var classObj = {};
for (var j = 0; j < target.absEl.elemset.length; j++) {
var es = target.absEl.elemset[j];
if (es) {
var klass = es.getAttribute("class").split(' ');
for (var k = 0; k < klass.length; k++)
classObj[klass[k]] = true;
}
}
for (var kk = 0; kk < Object.keys(classObj).length; kk++)
classes.push(Object.keys(classObj)[kk]);
}
var analysis = {};
for (var ii = 0; ii < classes.length; ii++) {
findNumber(classes[ii], "abcjs-v", analysis, "voice");
findNumber(classes[ii], "abcjs-l", analysis, "line");
findNumber(classes[ii], "abcjs-m", analysis, "measure");
}
if (target.staffPos)
analysis.staffPos = target.staffPos;
var closest = ev.target;
while (closest && closest.dataset && !closest.dataset.name && closest.tagName.toLowerCase() !== 'svg')
closest = closest.parentNode;
var parent = ev.target;
while (parent && parent.dataset && !parent.dataset.index && parent.tagName.toLowerCase() !== 'svg')
parent = parent.parentNode;
if (parent && parent.dataset) {
analysis.name = parent.dataset.name;
analysis.clickedName = closest.dataset.name;
analysis.parentClasses = parent.classList;
}
if (closest && closest.classList)
analysis.clickedClasses = closest.classList;
analysis.selectableElement = target.svgEl;
return {classes: classes, analysis: analysis}
}
module.exports = createAnalysis;