🕌
InDesign markdownからicmlにpandocに変換した後画像をセンタリングしたい
これを
こうする!
<Rectangle Self="uec" StrokeWeight="0" ItemTransform="0.25029 0 0 0.25029 792 -213.5">
倍率、開始X、開始Y、倍率、終了X、終了Y
(0,0)は左上
<GraphicBounds Left="0" Top="0" Right="3655.82838" Bottom="1706.05325" />
ここのRightとBottomがサイズが実際のサイズ
テキストフレームの横幅は多分792
グラフィックフレームの配置は中央(0,0)を軸に考える
今回の場合、縮小して (457.5)x2 213.5x2 のサイズで表示しようとしている
高さは別に変えないのでもう考えない方向
実際の幅 / 表示しようとしていた幅
3655.82838 / (457.5x2) = 0.250029
横幅をこの分増やす 396 / 0.250029 = 1583
表示したい画像の幅は (457.5)x2
センタリングしたい場合は引いて2で割る
(1583 - (457.5)x2) / 2 = 334.5
334.5 / 0.250029 = 1337
この分だけ左から寄せて、終了地点もこの分増やしてあげればいい
変換が必要かどうか
<Rectangle Self="uec" StrokeWeight="0" ItemTransform="0.38686 0 0 0.38686 512 -384">
396 / 0.38686 = 1023.78... ≒ 512x2
こっちの場合はほぼテキストフレームの幅100%分表示してるのでOK
<Rectangle Self="uec" StrokeWeight="0" ItemTransform="0.12392 0 0 0.12392 457.5 -213.5">
396 / 0.12392 = 3195 ≠ 457.5 x 2
右側に隙間がある配置。こちらは変換する必要がある
解説は後で直します。
とりあえず動いたコード。
hash使ってるからしゃーないのだけど、要素をソートして並べてくれてる。でも、icmlは順番があるようで、ソートするとうまく動かない。なので、内部でごにょごにょしてる。XML側の要素が増えたり変更があったりしたら動かなくなる。以下で動作は確認。
あと、PowerShellで実行しているため、STDOUTに出すとUTF16になるっぽくて困るので、perl script内でファイルに保存してる。
use utf8;
use XML::Simple qw(:strict);
use Data::Dumper;
use strict;
my $num = 396;
my @out;
my $flg = 0;
my @tmp = undef;
while(<>) {
my $line = $_;
#print $line;
if ($line =~/<Rectangle/) {
$flg = 1;
#print $line . "\n";
#print "--------------------\n";
push @tmp, $line;
next;
}
if ($flg == 1) {
#print $line . "\n";
#print "--------------------\n";
push @tmp, $line;
if ($line =~/\/Rectangle>/){
#print Dumper @tmp;
#print "--------------------\n";
my $config = XMLin(
join("", @tmp),
ForceArray => ['PathPointType'],
KeyAttr => { PathPointType => "Anchor"},
);
my @checkparam = split(" ", $config->{ItemTransform});
my $w = $config->{Image}->{Properties}->{GraphicBounds}->{Right};
#print "------------ $w --------------------\n";
my $width = $num / $checkparam[0];
if ($width > $checkparam[4] * 2) {
#print $width . "\n";
#print Dumper $config;
#print "convert\n";
#print Dumper @checkparam;
#print 396 / $checkparam[0] ;
#print "\n==========\n";
my $asdf = ($num / $checkparam[0]) - ($checkparam[4] * 2);
#print $asdf / 2;
#print "\n+++++++\n";
my $left = ($asdf / 2) / $checkparam[0];
my $right = $w + $left;
#print "$left //// $right";
$config->{Image}->{Properties}->{GraphicBounds}->{Right} = $right;
$config->{Image}->{Properties}->{GraphicBounds}->{Left} = $left;
my $outxml = XMLout(
{
"Rectangle" => $config
},
KeyAttr => { PathPointType => "Anchor"}
);
my @outxml_tmp = split(/\n/, $outxml);
#print Dumper @outxml_tmp;
#print Dumper @tmp;
my $path = [
$outxml_tmp[15],
$outxml_tmp[16],
$outxml_tmp[18],
$outxml_tmp[17],
];
my @outpath;
my $ww = $width / 2;
foreach(@$path){
my $pathline = $_;
$pathline =~s/Anchor=\"(-?)[0-9\.]+/Anchor=\"${1}${ww}/;
$pathline =~s/LeftDirection=\"(-?)[0-9\.]+/LeftDirection=\"${1}${ww}/;
$pathline =~s/RightDirection=\"(-?)[0-9\.]+/RightDirection=\"${1}${ww}/;
push @outpath, $pathline;
};
#print Dumper @outpath;
$tmp[1] =~s/ItemTransform=\"([0-9\.]+) 0 0 ([0-9\.]+) ([0-9\.])+ -([0-9\.]+)/ItemTransform=\"$1 0 0 $2 ${ww} -$4/;
$outxml_tmp[2] =~s/ItemTransform=\"([0-9\.]+) 0 0 ([0-9\.]+) -([0-9\.])+ -([0-9\.]+)/ItemTransform=\"$1 0 0 $2 -${ww} -$4/;
my $outxml_sorted = [
$tmp[1],
$outxml_tmp[11],
$outxml_tmp[12],
$outxml_tmp[13],
$outxml_tmp[14],
$outpath[0],
$outpath[1],
$outpath[2],
$outpath[3],
$outxml_tmp[19],
$outxml_tmp[20],
$outxml_tmp[21],
$outxml_tmp[22],
$outxml_tmp[2],
$outxml_tmp[4],
$outxml_tmp[5],
$outxml_tmp[6],
$outxml_tmp[7],
$outxml_tmp[8],
$outxml_tmp[9],
$outxml_tmp[3],
$outxml_tmp[10],
$outxml_tmp[23],
];
#print "++++++++++++++++++\n";
#print Dumper @$outxml_sorted;
#print join ("\r\n", @$outxml_sorted);
push @out, join("\n", @$outxml_sorted);
} else {
push @out, join("",@tmp);
}
$flg = 0;
@tmp = undef;
next;
}
next;
}
push @out, $line;
}
open(FH, "> my.icml");
print FH @out;
close FH;
Discussion