App-Music-ChordPro
view release on metacpan or search on metacpan
lib/ChordPro/res/abc/abc2svg/page-1.js view on Meta::CPAN
|| !page.h) { // empty page
if (page.in_page)
abc2svg.page.close_page(page)
abc2svg.page.open_page(page, 0)
}
page.blk = [] // in block
page.hb = page.h // keep the offset of the start of tune
break
case "<svg": // SVG image
h = Number(p.match(/viewBox="0 0 [\d.]+ ([\d.]+)"/)[1])
while (h + page.h >= page.hmax) { // if (still) page overflow
ht = page.blk ? 0 :
this.cfmt().topspace // tune continuation
if (page.blk) {
if (!page.hb) { // overflow on the first page
blkcpy(page)
nh = 0
} else {
nh = page.h - page.hb
page.h = page.hb
}
}
abc2svg.page.close_page(page)
abc2svg.page.open_page(page, ht)
if (page.blk) { // if inside a block
blkcpy(page) // output the beginning of the tune
page.h = nh
}
if (h > page.hmax)
break // error
}
// if no overflow yet, keep the block
if (page.blk)
page.blk.push(p)
else
abc2svg.page.user_out(p)
page.h += h
break
case "</di": // end of block
if (page.blk)
blkcpy(page)
break
// default:
////fixme: %%beginml cannot be treated (no information about its height)
// break
}
}, // img_in()
// handle the page related parameters
set_fmt: function(of, cmd, parm) {
var v,
user = this.get_user(),
cfmt = this.cfmt(),
page = this.page
if (cmd == "pageheight") {
v = this.get_unit(parm)
if (isNaN(v)) {
this.syntax(1, this.errs.bad_val, '%%' + cmd)
return
}
if (!user.img_out || !abc2svg.abc_end)
v = 0
cfmt.pageheight = v
if (!v) {
if (abc2svg.page.user_out) {
user.img_out = abc2svg.page.user_out
abc2svg.page.user_out = null
abc2svg.page.abc_end = abc2svg.page.abc_end_o
}
delete this.page
return
}
// if first definition, install the hook
if (!page || !abc2svg.page.user_out) {
this.page = page = {
abc: this,
topmargin: 38, // 1cm
botmargin: 38, // 1cm
// gutter: 0,
h: 0, // current page height
pn: 0, // page number
pna: 0, // absolute page number
ffsty: '', // style of the footer
first: true // no skip to next page
}
// don't let the backend handle the header/footer
if (cfmt.header) {
page.header = cfmt.header;
cfmt.header = null
}
if (cfmt.footer) {
page.footer = cfmt.footer;
cfmt.footer = null
}
if (cfmt.header1) {
page.header1 = cfmt.header1
cfmt.header1 = null
}
if (cfmt.header2) {
page.header2 = cfmt.header2
cfmt.header2 = null
}
if (cfmt.footer2) {
page.footer2 = cfmt.footer2
cfmt.footer2 = null
}
// get the previously defined page parameters
if (cfmt.botmargin != undefined) {
v = this.get_unit(cfmt.botmargin)
if (!isNaN(v))
page.botmargin = v
}
if (cfmt.topmargin != undefined) {
v = this.get_unit(cfmt.topmargin)
if (!isNaN(v))
page.topmargin = v
}
if (cfmt.gutter != undefined) {
v = this.get_unit(cfmt.gutter)
if (!isNaN(v))
page.gutter = v
}
if (cfmt.oneperpage)
page.oneperpage = this.get_bool(cfmt.oneperpage)
if (!cfmt.dateformat)
cfmt.dateformat = "%b %e, %Y %H:%M"
// set the hooks
if (!abc2svg.page.user_out) {
abc2svg.page.user_out = user.img_out
abc2svg.page.abc_end_o = abc2svg.abc_end
}
abc2svg.abc_end = abc2svg.page.abc_end.bind(this,
abc2svg.abc_end)
user.img_out = abc2svg.page.img_in.bind(this)
}
return
}
if (page) {
switch (cmd) {
case "header":
case "footer":
case "header1":
case "header2":
case "footer2":
page[cmd] = parm
return
case "newpage":
if (!parm)
break
v = Number(parm)
if (isNaN(v)) {
this.syntax(1, this.errs.bad_val, '%%' + cmd)
return
}
page.pn = v - 1
return
case "gutter":
case "botmargin":
case "topmargin":
v = this.get_unit(parm)
if (isNaN(v)) {
this.syntax(1, this.errs.bad_val, '%%' + cmd)
return
}
page[cmd] = v
return
case "oneperpage":
page[cmd] = this.get_bool(parm)
return
}
}
of(cmd, parm)
}, // set_fmt()
set_hooks: function(abc) {
abc.set_format("page-format", 1) // do page formatting
abc.set_format = abc2svg.page.set_fmt.bind(abc, abc.set_format)
abc.set_pagef()
}
} // page
if (!abc2svg.mhooks)
abc2svg.mhooks = {}
abc2svg.mhooks.page = abc2svg.page.set_hooks
( run in 0.658 second using v1.01-cache-2.11-cpan-e1769b4cff6 )