|
|
var tunebook = require('./abc_tunebook'); |
|
|
var Tune = require('../data/abc_tune'); |
|
|
|
|
|
var EngraverController = require('../write/engraver-controller'); |
|
|
var Parse = require('../parse/abc_parse'); |
|
|
var wrap = require('../parse/wrap_lines'); |
|
|
|
|
|
|
|
|
var resizeDivs = {}; |
|
|
function resizeOuter() { |
|
|
var width = window.innerWidth; |
|
|
for (var id in resizeDivs) { |
|
|
if (resizeDivs.hasOwnProperty(id)) { |
|
|
var outer = resizeDivs[id]; |
|
|
var ofs = outer.offsetLeft; |
|
|
width -= ofs * 2; |
|
|
outer.style.width = width + "px"; |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
try { |
|
|
window.addEventListener("resize", resizeOuter); |
|
|
window.addEventListener("orientationChange", resizeOuter); |
|
|
} catch(e) { |
|
|
|
|
|
} |
|
|
|
|
|
function renderOne(div, tune, params, tuneNumber, lineOffset) { |
|
|
if (params.viewportHorizontal) { |
|
|
|
|
|
div.innerHTML = '<div class="abcjs-inner"></div>'; |
|
|
if (params.scrollHorizontal) { |
|
|
div.style.overflowX = "auto"; |
|
|
div.style.overflowY = "hidden"; |
|
|
} else |
|
|
div.style.overflow = "hidden"; |
|
|
resizeDivs[div.id] = div; |
|
|
div = div.children[0]; |
|
|
} |
|
|
else if (params.viewportVertical) { |
|
|
|
|
|
div.innerHTML = '<div class="abcjs-inner scroll-amount"></div>'; |
|
|
div.style.overflowX = "hidden"; |
|
|
div.style.overflowY = "auto"; |
|
|
div = div.children[0]; |
|
|
} |
|
|
else |
|
|
div.innerHTML = ""; |
|
|
var engraver_controller = new EngraverController(div, params); |
|
|
engraver_controller.engraveABC(tune, tuneNumber, lineOffset); |
|
|
tune.engraver = engraver_controller; |
|
|
if (params.viewportVertical || params.viewportHorizontal) { |
|
|
|
|
|
var parent = div.parentNode; |
|
|
parent.style.width = div.style.width; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
var renderAbc = function(output, abc, parserParams, engraverParams, renderParams) { |
|
|
|
|
|
var params = {}; |
|
|
var key; |
|
|
if (parserParams) { |
|
|
for (key in parserParams) { |
|
|
if (parserParams.hasOwnProperty(key)) { |
|
|
params[key] = parserParams[key]; |
|
|
} |
|
|
} |
|
|
if (params.warnings_id && params.tablature) { |
|
|
params.tablature.warning_id = params.warnings_id; |
|
|
} |
|
|
} |
|
|
if (engraverParams) { |
|
|
for (key in engraverParams) { |
|
|
if (engraverParams.hasOwnProperty(key)) { |
|
|
|
|
|
if (key === "listener") { |
|
|
if (engraverParams[key].highlight) |
|
|
params.clickListener = engraverParams[key].highlight; |
|
|
} else |
|
|
params[key] = engraverParams[key]; |
|
|
} |
|
|
} |
|
|
} |
|
|
if (renderParams) { |
|
|
for (key in renderParams) { |
|
|
if (renderParams.hasOwnProperty(key)) { |
|
|
params[key] = renderParams[key]; |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
function callback(div, tune, tuneNumber, abcString) { |
|
|
var removeDiv = false; |
|
|
if (div === "*") { |
|
|
removeDiv = true; |
|
|
div = document.createElement("div"); |
|
|
div.setAttribute("style", "visibility: hidden;"); |
|
|
document.body.appendChild(div); |
|
|
} |
|
|
if (!removeDiv && params.wrap && params.staffwidth) { |
|
|
tune = doLineWrapping(div, tune, tuneNumber, abcString, params); |
|
|
return tune; |
|
|
} |
|
|
if (params.afterParsing) |
|
|
params.afterParsing(tune, tuneNumber, abcString); |
|
|
renderOne(div, tune, params, tuneNumber, 0); |
|
|
if (removeDiv) |
|
|
div.parentNode.removeChild(div); |
|
|
return null; |
|
|
} |
|
|
|
|
|
return tunebook.renderEngine(callback, output, abc, params); |
|
|
}; |
|
|
|
|
|
function doLineWrapping(div, tune, tuneNumber, abcString, params) { |
|
|
var engraver_controller = new EngraverController(div, params); |
|
|
var widths = engraver_controller.getMeasureWidths(tune); |
|
|
|
|
|
var ret = wrap.calcLineWraps(tune, widths, params); |
|
|
if (ret.reParse) { |
|
|
var abcParser = new Parse(); |
|
|
abcParser.parse(abcString, ret.revisedParams); |
|
|
tune = abcParser.getTune(); |
|
|
var warnings = abcParser.getWarnings(); |
|
|
if (warnings) |
|
|
tune.warnings = warnings; |
|
|
} |
|
|
if (params.afterParsing) |
|
|
params.afterParsing(tune, tuneNumber, abcString); |
|
|
renderOne(div, tune, ret.revisedParams, tuneNumber, 0); |
|
|
tune.explanation = ret.explanation; |
|
|
return tune; |
|
|
} |
|
|
|
|
|
module.exports = renderAbc; |
|
|
|