Graph-Easy-As_svg
view release on metacpan or search on metacpan
lib/Graph/Easy/As_svg.pm view on Meta::CPAN
my $my = $max_y + $yl + $yr;
# we need both xmlns= and xmlns:xlink to make Firefix 1.5 happy :-(
$txt .=
# '<svg viewBox="0 0 ##MX## ##MY##" width="##MX##" height="##MY##" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">'
'<svg width="##MX##" height="##MY##" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">'
."\n<!-- Generated at " . scalar localtime() . " by:\n " .
"Graph::Easy v$Graph::Easy::VERSION\n Graph::Easy::As_svg v$Graph::Easy::As_svg::VERSION\n-->\n\n";
my $title = _quote($self->title());
$txt .= "<title>$title</title>\n" if $title ne '';
$txt .= "<defs>\n##devs##";
# clear used definitions
$self->{_svg_defs} = {};
# which attributes must be output as what name:
my $mutator = {
background => 'fill',
'align' => \&_remap_align,
'color' => 'stroke',
'fontsize' => \&_remap_font_size,
'font' => 'font-family',
};
my $skip = qr/^(
arrow(style|shape)|
(auto)?(link|title|label)|
bordercolor|
borderstyle|
borderwidth|
border|
color|
colorscheme|
comment|
columns|
flow|
format|
gid|
labelpos|
labelcolor|
linkbase|
line-height|
letter-spacing|
margin.*|
nodeclass|
padding.*|
rows|
root|
size|
style|
shape|
title|
type|
textstyle|
width|
rotate|
)\z/x;
my $overlay = {
edge => {
"stroke" => 'black',
"text-align" => 'center',
"font-size" => '13px',
},
node => {
"font-size" => '16px',
"text-align" => 'center',
},
};
$overlay->{graph} =
{
"font-size" => '16px',
"text-align" => 'center',
"border" => '1px dashed #808080',
};
# generate the class attributes first
my $style = $self->_class_styles( $skip, $mutator, '', ' ', $overlay);
$txt .=
"\n <!-- class definitions -->\n"
." <style type=\"text/css\"><![CDATA[\n$style ]]></style>\n"
if $style ne '';
$txt .="</defs>\n\n";
###########################################################################
# prepare graph label output
my $lp = 'top';
my ($lw,$lh) = Graph::Easy::Node::_svg_dimensions($self);
# some padding on the label
$lw = int($em*$lw + $em + 0.5); $lh = int($LINE_HEIGHT*$lh+0.5);
my $label = $self->label();
if ($label ne '')
{
$lp = $self->attribute('labelpos');
# handle the case where the graph label is bigger than the graph itself
if ($mx < ($lw+$em))
{
# move the content to the right to center it
$xl += (($lw+$em) - $mx) / 2;
# and then make the graph more wide
$mx = $em + $lw;
}
$my += $lh;
}
###########################################################################
# output the graph's background and border
my $em2 = $em / 2;
{
# 'inherit' only works for HTML, not for SVG
my $bg = $self->color_attribute('fill'); $bg = 'white' if $bg eq 'inherit';
my $bs = $self->attribute('borderstyle');
my $cl = $self->color_attribute('bordercolor'); $cl = $bg if $bs eq 'none';
my $bw = $self->attribute('borderwidth') || 1;
$bw =~ s/px//;
# We always need to output a background rectangle, otherwise printing the
# SVG from Firefox ends you up with a black background, which rather ruins
# the day:
# XXX TODO adjust dasharray
my $att = {
'stroke-dasharray' => $strokes->{$bs} || '',
'stroke-width' => $bw,
'stroke' => $cl,
'fill' => $bg,
};
# avoid stroke-dasharray="":
delete $att->{'stroke-dasharray'} unless $att->{'stroke-dasharray'} ne '';
( run in 1.004 second using v1.01-cache-2.11-cpan-5735350b133 )