|
|
describe("Miscellaneous", function () { |
|
|
var abcJazzChords = "X:1\n" + |
|
|
"%%jazzchords\n" + |
|
|
"K:C\n" + |
|
|
"\"C7\"C \"C/B\"B \"x\"A \"x/C\"G \"/E\"E|"; |
|
|
|
|
|
var expectedJazzChords = [ |
|
|
{input: 'C7', output: 'C\x037\x03'}, |
|
|
{input: 'C/B', output: 'C\x03\x03/B'}, |
|
|
{input: 'x', output: '\x03x\x03'}, |
|
|
{input: 'x/C', output: '\x03x\x03/C'}, |
|
|
{input: '/E', output: '\x03\x03/E'}, |
|
|
] |
|
|
|
|
|
var abcGlissando = "X:1\n" + |
|
|
"L:1/4\n" + |
|
|
"%%stretchlast\n" + |
|
|
"!glissando(!C!glissando)!e\n" + |
|
|
"!glissando(!C!glissando)!E !glissando(!C!glissando)!F !glissando(!C!glissando)!G !glissando(!C!glissando)!A !glissando(!C!glissando)!B !glissando(!C!glissando)!c \n" + |
|
|
"!glissando(!C!glissando)!d !glissando(!C!glissando)!e !glissando(!C!glissando)!f\n" + |
|
|
"!glissando(!g!glissando)!f !glissando(!g!glissando)!e !glissando(!g!glissando)!d !glissando(!g!glissando)!c !glissando(!g!glissando)!f !glissando(!g!glissando)!A !glissando(!g!glissando)!G !glissando(!g!glissando)!F !glissando(!g!glissando)!E !glissando(!g!glissando)!D \n" + |
|
|
"\n" + |
|
|
"\n" + |
|
|
"\n" + |
|
|
"\n" + |
|
|
"\n"; |
|
|
|
|
|
var expectedGlissando = [ |
|
|
{x: 63, y: 36, w: 329, h: 40}, |
|
|
{x: 63, y: 156, w: 35, h: 12}, |
|
|
{x: 181, y: 153, w: 35, h: 14}, |
|
|
{x: 298, y: 150, w: 35, h: 16}, |
|
|
{x: 416, y: 147, w: 35, h: 18}, |
|
|
{x: 533, y: 144, w: 35, h: 20}, |
|
|
{x: 651, y: 139, w: 41, h: 25}, |
|
|
{x: 63, y: 227, w: 95, h: 32}, |
|
|
{x: 298, y: 223, w: 95, h: 35}, |
|
|
{x: 533, y: 218, w: 101, h: 40}, |
|
|
{x: 63, y: 307, w: 17, h: 7}, |
|
|
{x: 133, y: 308, w: 17, h: 8}, |
|
|
{x: 204, y: 309, w: 17, h: 9}, |
|
|
{x: 275, y: 311, w: 17, h: 10}, |
|
|
{x: 345, y: 307, w: 17, h: 7}, |
|
|
{x: 416, y: 313, w: 17, h: 11}, |
|
|
{x: 486, y: 315, w: 17, h: 12}, |
|
|
{x: 557, y: 316, w: 23, h: 18}, |
|
|
{x: 628, y: 318, w: 23, h: 20}, |
|
|
{x: 698, y: 319, w: 29, h: 28}, |
|
|
] |
|
|
|
|
|
var abcDirectives = "X:1\n" + |
|
|
"L:1/4\n" + |
|
|
"CCCC!D.C.alcoda!|DDDD!D.C.alfine!|EEEE!D.S.alcoda!|FFFF!D.S.alfine!|!D.C.!G!5!GGG|\n" |
|
|
|
|
|
var expectedDirectives = [ |
|
|
{ c: 'D.C. al coda', anchor: 'end'}, |
|
|
{ c: 'D.C. al fine', anchor: 'end'}, |
|
|
{ c: 'D.S. al coda', anchor: 'end'}, |
|
|
{ c: 'D.S. al fine', anchor: 'end'}, |
|
|
{ c: 'D.C.', anchor: 'middle'}, |
|
|
{ c: '5', anchor: 'middle'}, |
|
|
] |
|
|
|
|
|
var abcSetFont = 'X:1\n' + |
|
|
'%%setfont-1 cursive 16 bold\n' + |
|
|
'%%setfont-7 Arial 19 bold\n' + |
|
|
'T:Title $1bold$0 $$100 reg, the\n' + |
|
|
'T:subtitle $1bold$0 reg\n' + |
|
|
'C:Thomas $7Fats$0 Waller\n' + |
|
|
'O:Copyright $11924$0 All Rights Reserved\n' + |
|
|
'A:by $1Me\n' + |
|
|
'P:AA$1BB$0CC\n' + |
|
|
'H:one $1two $0 three\n' + |
|
|
'H:aye $1bee $0 sea\n' + |
|
|
'B:$1book\n' + |
|
|
'D:records\n' + |
|
|
'N:four $1five $0 six\n' + |
|
|
'N:seven\n' + |
|
|
'L:1/4\n' + |
|
|
'M:4/4\n' + |
|
|
'W: lo $1loo $0lou $$1dollar\n' + |
|
|
'K:C\n' + |
|
|
'"C$1m$7\\ntwo"G "Dm7"E2 F | "^above $1the$0 staff"D4 |]\n' + |
|
|
'w: la $1le $0lu\n' + |
|
|
'P:chorus $1with feeling\n' + |
|
|
'A4|' + |
|
|
'\n' + |
|
|
'X:1\n' + |
|
|
'T:Title bold $$100 reg, the\n' + |
|
|
'T:subtitle bold reg\n' + |
|
|
'C:Thomas Fats Waller\n' + |
|
|
'O:Copyright 1924 All Rights Reserved\n' + |
|
|
'A:by Me\n' + |
|
|
'P:AABBCC\n' + |
|
|
'H:one two three\n' + |
|
|
'H:aye bee sea\n' + |
|
|
'N:four five six\n' + |
|
|
'N:seven\n' + |
|
|
'L:1/4\n' + |
|
|
'M:4/4\n' + |
|
|
'W: lo loo lou $$1dollar\n' + |
|
|
'K:C\n' + |
|
|
'"Cm"G E2 F | "^above the staff"D4 |]\n' + |
|
|
'w: la le lu\n' + |
|
|
'P:chorus with feeling\n' + |
|
|
'A4|' |
|
|
|
|
|
var expectedSetFont = [ |
|
|
{"klass":"abcjs-title","phrases":[ |
|
|
{"content":"The Title ","attrs":{"font-family":"Times New Roman","font-size":27,"font-weight":"normal","font-style":"normal","font-decoration":"none"}}, |
|
|
{"content":"bold","attrs":{"font-family":"cursive","font-size":16,"font-weight":"bold","font-style":"normal","font-decoration":"none"}}, |
|
|
{"content":" $100 reg","attrs":{"font-family":"Times New Roman","font-size":27,"font-weight":"normal","font-style":"normal","font-decoration":"none"}} |
|
|
]}, |
|
|
{"klass":"abcjs-text abcjs-subtitle","phrases":[ |
|
|
{"content":"subtitle ","attrs":{"font-family":"Times New Roman","font-size":21,"font-weight":"normal","font-style":"normal","font-decoration":"none"}}, |
|
|
{"content":"bold","attrs":{"font-family":"cursive","font-size":16,"font-weight":"bold","font-style":"normal","font-decoration":"none"}}, |
|
|
{"content":" reg","attrs":{"font-family":"Times New Roman","font-size":21,"font-weight":"normal","font-style":"normal","font-decoration":"none"}} |
|
|
]}, |
|
|
{"klass":"abcjs-composer","phrases":[ |
|
|
{"content":"Thomas ","attrs":{"font-family":"Times New Roman","font-size":19,"font-weight":"normal","font-style":"italic","font-decoration":"none"}}, |
|
|
{"content":"Fats","attrs":{"font-family":"Arial","font-size":19,"font-weight":"bold","font-style":"normal","font-decoration":"none"}}, |
|
|
{"content":" Waller","attrs":{"font-family":"Times New Roman","font-size":19,"font-weight":"normal","font-style":"italic","font-decoration":"none"}}, |
|
|
{"content":" (","attrs":{"font-family":"Times New Roman","font-size":19,"font-weight":"normal","font-style":"italic","font-decoration":"none"}},{"content":"Copyright ","attrs":{"font-family":"Times New Roman","font-size":19,"font-weight":"normal","font-style":"italic","font-decoration":"none"}}, |
|
|
{"content":"1924","attrs":{"font-family":"cursive","font-size":16,"font-weight":"bold","font-style":"normal","font-decoration":"none"}}, |
|
|
{"content":" All Rights Reserved","attrs":{"font-family":"Times New Roman","font-size":19,"font-weight":"normal","font-style":"italic","font-decoration":"none"}}, |
|
|
{"content":")","attrs":{"font-family":"Times New Roman","font-size":19,"font-weight":"normal","font-style":"italic","font-decoration":"none"}}]}, |
|
|
{"klass":"abcjs-author","phrases":[ |
|
|
{"content":"by ","attrs":{"font-family":"Times New Roman","font-size":19,"font-weight":"normal","font-style":"italic","font-decoration":"none"}}, |
|
|
{"content":"Me","attrs":{"font-family":"cursive","font-size":16,"font-weight":"bold","font-style":"normal","font-decoration":"none"}}]}, |
|
|
{"klass":"abcjs-part-order","phrases":[ |
|
|
{"content":"AA","attrs":{"font-family":"Times New Roman","font-size":20,"font-weight":"normal","font-style":"normal","font-decoration":"none"}}, |
|
|
{"content":"BB","attrs":{"font-family":"cursive","font-size":16,"font-weight":"bold","font-style":"normal","font-decoration":"none"}}, |
|
|
{"content":"CC","attrs":{"font-family":"Times New Roman","font-size":20,"font-weight":"normal","font-style":"normal","font-decoration":"none"}}]}, |
|
|
{"key":"subtitle","text":[{"text":"subtitle "},{"font":{"face":"cursive","weight":"bold","style":"normal","decoration":"none","size":16},"text":"bold"},{"text":" reg"}]}, |
|
|
{"key":"chord","text":"C$1m$7"}, |
|
|
{"key":"lyric","text":"la"}, |
|
|
{"key":"chord","text":"Dm7"}, |
|
|
{"key":"lyric","text":"$1le"}, |
|
|
{"key":"lyric","text":"$0lu"}, |
|
|
{"key":"chord","text":"above $1the$0 staff"}, |
|
|
{"phrases":[ |
|
|
{"content":"lo ","attrs":{"font-family":"Times New Roman","font-size":21,"font-weight":"normal","font-style":"normal","font-decoration":"none"}}, |
|
|
{"content":"loo ","attrs":{"font-family":"cursive","font-size":16,"font-weight":"bold","font-style":"normal","font-decoration":"none"}}, |
|
|
{"content":"lou $1dollar","attrs":{"font-family":"Times New Roman","font-size":21,"font-weight":"normal","font-style":"normal","font-decoration":"none"}} |
|
|
]}, |
|
|
{"klass":"abcjs-extra-text abcjs-book","phrases":[ |
|
|
{"content":"Book: ","attrs":{"font-family":"Times New Roman","font-size":21,"font-weight":"normal","font-style":"normal","font-decoration":"none"}}, |
|
|
{"content":"book","attrs":{"font-family":"cursive","font-size":16,"font-weight":"bold","font-style":"normal","font-decoration":"none"}} |
|
|
]}, |
|
|
{"klass":"abcjs-extra-text abcjs-discography","font":"historyfont","text":"Discography: records"}, |
|
|
{"font":"historyfont","text":"Notes:"}, |
|
|
{"phrases":[ |
|
|
{"content":"four ","attrs":{"font-family":"Times New Roman","font-size":21,"font-weight":"normal","font-style":"normal","font-decoration":"none"}}, |
|
|
{"content":"five ","attrs":{"font-family":"cursive","font-size":16,"font-weight":"bold","font-style":"normal","font-decoration":"none"}}, |
|
|
{"content":" six","attrs":{"font-family":"Times New Roman","font-size":21,"font-weight":"normal","font-style":"normal","font-decoration":"none"}} |
|
|
]}, |
|
|
{"font":"historyfont","text":"seven"}, |
|
|
{"font":"historyfont","text":"History:"}, |
|
|
{"phrases":[ |
|
|
{"content":"one ","attrs":{"font-family":"Times New Roman","font-size":21,"font-weight":"normal","font-style":"normal","font-decoration":"none"}}, |
|
|
{"content":"two ","attrs":{"font-family":"cursive","font-size":16,"font-weight":"bold","font-style":"normal","font-decoration":"none"}}, |
|
|
{"content":" three","attrs":{"font-family":"Times New Roman","font-size":21,"font-weight":"normal","font-style":"normal","font-decoration":"none"}} |
|
|
]}, |
|
|
{"phrases":[ |
|
|
{"content":"aye ","attrs":{"font-family":"Times New Roman","font-size":21,"font-weight":"normal","font-style":"normal","font-decoration":"none"}}, |
|
|
{"content":"bee ","attrs":{"font-family":"cursive","font-size":16,"font-weight":"bold","font-style":"normal","font-decoration":"none"}}, |
|
|
{"content":" sea","attrs":{"font-family":"Times New Roman","font-size":21,"font-weight":"normal","font-style":"normal","font-decoration":"none"}} |
|
|
]} |
|
|
] |
|
|
|
|
|
var abcLineWidth = 'X:1\n' + |
|
|
"L:1/8\n" + |
|
|
"AB||ef g D|Df f/D/| A,4 c'4|]\n" |
|
|
|
|
|
var abcAccentPosition = 'X:1\n' + |
|
|
"K:C\n" + |
|
|
"!>!A2!>!c2|T!>!A2T!>!c2|]\n" |
|
|
|
|
|
it("line-width", function () { |
|
|
abcjs.renderAbc("paper", abcLineWidth, { add_classes: true}); |
|
|
var height = extractHeight() |
|
|
chai.assert.equal(height, "0.700", "No change to lineThickness") |
|
|
abcjs.renderAbc("paper", abcLineWidth, { add_classes: true, lineThickness: 0.1}); |
|
|
height = extractHeight() |
|
|
chai.assert.equal(height, "0.900", "lineThickness = 0.1") |
|
|
abcjs.renderAbc("paper", abcLineWidth, { add_classes: true, lineThickness: 0.5}); |
|
|
height = extractHeight() |
|
|
chai.assert.equal(height, "1.700", "lineThickness = 0.5") |
|
|
}) |
|
|
|
|
|
function extractHeight() { |
|
|
var topLine = document.querySelector("#paper .abcjs-top-line") |
|
|
var path = topLine.getAttribute('d') |
|
|
var coordinates = path.split(" L ") |
|
|
var first = coordinates[1].split(' ') |
|
|
var second = coordinates[2].split(' ') |
|
|
return (parseFloat(second[1]) - parseFloat(first[1])).toFixed(3) |
|
|
} |
|
|
|
|
|
it("accent position", function () { |
|
|
abcjs.renderAbc("paper", abcAccentPosition, { accentAbove: true }); |
|
|
abcjs.renderAbc("paper2", abcAccentPosition, { }); |
|
|
}) |
|
|
|
|
|
it("jazz chords", function () { |
|
|
extractChords(abcJazzChords, expectedJazzChords); |
|
|
}) |
|
|
|
|
|
it("glissando", function () { |
|
|
draw(abcGlissando, expectedGlissando); |
|
|
}) |
|
|
|
|
|
it("directives", function () { |
|
|
var visualObj = abcjs.renderAbc("paper", abcDirectives); |
|
|
var voice = visualObj[0].lines[0].staff[0].voices[0] |
|
|
var results = [] |
|
|
for (var i = 0; i < voice.length; i++) { |
|
|
var elem = voice[i].abselem.children; |
|
|
for (var j = 0; j < elem.length; j++) { |
|
|
var rel = elem[j] |
|
|
if (rel.type === 'decoration') |
|
|
results.push({ c: elem[j].c, anchor: elem[j].anchor }) |
|
|
} |
|
|
} |
|
|
chai.assert.deepEqual(results, expectedDirectives) |
|
|
}) |
|
|
|
|
|
it("set-font", function() { |
|
|
var visualObj = abcjs.renderAbc(["paper", 'paper2'], abcSetFont, {add_classes:true, jazzchords: true}); |
|
|
var results = extractText(visualObj) |
|
|
for (var i = 0; i < results.length; i++) { |
|
|
chai.assert.deepEqual(results[i], expectedSetFont[i], "index: " + i + "\n" + JSON.stringify(results[i])+"\n" + JSON.stringify(expectedSetFont[i])) |
|
|
} |
|
|
}) |
|
|
}) |
|
|
|
|
|
function extractText(visualObj) { |
|
|
var textResults = [] |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
var topText = visualObj[0].topText.rows.filter(item => { |
|
|
return item.text !== undefined || item.phrases !== undefined |
|
|
}).map(item => { |
|
|
var ret = {} |
|
|
if (item.klass) ret.klass = item.klass; |
|
|
if (item.font) ret.font = item.font |
|
|
if (item.text) ret.text = item.text |
|
|
if (item.phrases) ret.phrases = item.phrases |
|
|
return ret |
|
|
}) |
|
|
textResults = textResults.concat(topText) |
|
|
|
|
|
for (var i = 0; i < visualObj[0].lines.length; i++) { |
|
|
var line = visualObj[0].lines[i] |
|
|
if (line.subtitle) { |
|
|
textResults.push({key: 'subtitle', text:line.subtitle.text}) |
|
|
} else if (line.staff) { |
|
|
var voice = line.staff[0].voices[0] |
|
|
for (var i = 0; i < voice.length; i++) { |
|
|
var elem = voice[i]; |
|
|
if (elem.chord) { |
|
|
for (var j = 0; j < elem.chord.length; j++) { |
|
|
var chord = elem.chord[j] |
|
|
var item = { key: "chord", text: chord.name} |
|
|
if (chord.font) |
|
|
item.font = chord.font |
|
|
textResults.push(item) |
|
|
} |
|
|
} |
|
|
if (elem.lyric) { |
|
|
for (var j = 0; j < elem.lyric.length; j++) { |
|
|
var lyric = elem.lyric[j] |
|
|
var item = {key: "lyric", text: lyric.syllable} |
|
|
if (lyric.font) |
|
|
item.font = lyric.font |
|
|
textResults.push(item) |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
var bottomText = visualObj[0].bottomText.rows.filter(item => { |
|
|
return item.text !== undefined || item.phrases !== undefined |
|
|
}).map(item => { |
|
|
var ret = {} |
|
|
if (item.klass) ret.klass = item.klass; |
|
|
if (item.font) ret.font = item.font |
|
|
if (item.text) ret.text = item.text |
|
|
if (item.phrases) ret.phrases = item.phrases |
|
|
return ret |
|
|
}) |
|
|
textResults = textResults.concat(bottomText) |
|
|
console.log(JSON.stringify(textResults)) |
|
|
return textResults |
|
|
} |
|
|
|
|
|
function extractChords(abc, expected) { |
|
|
var visualObj = abcjs.renderAbc("paper", abc); |
|
|
var line = visualObj[0].lines[0]; |
|
|
var staff = line.staff[0]; |
|
|
var voice = staff.voices[0]; |
|
|
var chords = []; |
|
|
for (var i = 0; i < voice.length; i++) { |
|
|
var el = voice[i]; |
|
|
if (el.chord) { |
|
|
var output = el.abselem.extra[0] |
|
|
chords.push({input: el.chord[0].name, output: output.c}) |
|
|
} |
|
|
} |
|
|
|
|
|
chai.assert.equal(chords.length, expected.length, "wrong number of chords"); |
|
|
for (i = 0; i < chords.length; i++) { |
|
|
chai.assert.equal(chords[i].input, expected[i].input, i + ": Inputs different"); |
|
|
chai.assert.equal(chords[i].output, expected[i].output, i + ": Outputs different"); |
|
|
} |
|
|
} |
|
|
|
|
|
function draw(abc, expected) { |
|
|
var visualObj = abcjs.renderAbc("paper", abc); |
|
|
var gliss = document.querySelectorAll('[data-name="glissando"]') |
|
|
for (var i = 0; i < gliss.length; i++) { |
|
|
var bb = gliss[i].getBBox() |
|
|
bb = {x: Math.round(bb.x), y: Math.round(bb.y), w: Math.round(bb.width), h: Math.round(bb.height)} |
|
|
|
|
|
chai.assert.deepEqual(bb, expected[i]) |
|
|
} |
|
|
} |
|
|
|
|
|
|