App-Music-ChordPro
view release on metacpan or search on metacpan
lib/ChordPro/Delegate/ABC.pm view on Meta::CPAN
my $kv = {};
$kv = parse_kvm( @pre ) if @pre;
$kv = { %$kv, %{$elt->{opts}} };
$kv->{split} //= 1; # less overhead. really.
$kv->{scale} ||= 1; # with id: design scale
$kv->{align} //= ($kv->{center}//0) ? "center" : "left";
if ( $kv->{width} ) {
$pw = $kv->{width};
}
unshift( @preamble,
grep { /^%%/ } @pre,
$pw ? sprintf("%%%%pagewidth %dpx", $pw) : (),
);
# Create the temp file for the ABC source.
my $fd;
unless ( $fd = fs_open( $src, '>:utf8' ) ) {
warn("Error in ABC embedding: $src: $!\n");
return;
}
# Copy. We assume the user knows how to write ABC.
for ( @preamble ) {
print $fd $_, "\n";
warn($_, "\n") if DEBUG > 1;
}
for ( @data ) {
$prep->{abc}->($_) if $prep->{abc};
print $fd $_, "\n";
warn($_, "\n") if DEBUG > 1;
}
for ( @{ beo( $cfg, 'postamble' ) || [] } ) {
print $fd $_, "\n";
warn($_, "\n") if DEBUG > 1;
}
unless ( close($fd) ) {
warn("Error in ABC embedding: $src: $!\n");
return;
}
my @lines;
my $ret;
if ( $abc2svg->{method} eq QUICKJSXS ) {
# QuickJS with embedded interpreter.
my $js = JavaScript::QuickJS->new;
my $base = $abc2svg->{abclib} . "/abc2svg";
$js->set_module_base($base);
my $qjsdata =
{
print => sub { push( @lines, split(/\n/, $_) ) for @_ },
printErr => sub { print STDERR @_ },
quit => sub { exit 66 },
readFile => sub { slurp($_[0]) },
get_mtime => sub {
my @stat = stat($_[0]);
return @stat ? 1000*$stat[9] : undef;
},
loadjs => sub {
my ( $fn, $relay, $onerror ) = @_;
if ( fs_test( sr => "$base/$fn" ) ) {
$js->eval(slurp("$base/$_[0]"));
$relay->() if $relay;
}
elsif ( $onerror ) {
$onerror->();
}
else {
warn( qq{loadjs("$fn"): $!\n} );
}
},
};
$js->set_globals
( args => [ $src ],
load => sub { $js->eval(slurp("$base/$_[0]")) },
abc2svg => $qjsdata,
abc => {}, # for backends
);
warn( "+ QuickJS_XS[", CP->display($base), "] $src\n") if DEBUG;
my $hooks = "$base/../hooks.js";
undef $hooks unless fs_test( s => $hooks );
eval {
$js->eval( slurp("$base/abc2svg-1.js") );
$js->eval( slurp($hooks) ) if $hooks;
if ( -r "$base/../cmd.js" ) {
warn(" QuickJS_XS using ", CP->display("$base/../cmd.js"),
$hooks ? "+hooks" : "", "\n" )
if DEBUG;
$js->eval( slurp("$base/../cmd.js") );
}
else {
warn(" QuickJS_XS using ", CP->display("$base/cmdline.js"),
$hooks ? "+hooks" : "", "\n" )
if DEBUG;
$js->eval( slurp("$base/cmdline.js") );
}
$js->eval( slurp("$base/tohtml.js") );
$js->eval( qq{abc_cmd("ChordPro", args, "QuickJS_XS")} );
};
warn($@) if $@;
undef $js;
if ( DEBUG ) {
my $fd = fs_open( $out, '>:utf8' );
print $fd join("\n", @lines), "\n";
close($fd);
}
}
elsif ( $abc2svg->{method} eq QUICKJS ) {
# QuickJS with external interpreter.
( run in 3.035 seconds using v1.01-cache-2.11-cpan-99c4e6809bf )