🕌

InDesign markdownからicmlにpandocに変換した後画像をセンタリングしたい

2022/09/04に公開


これを

こうする!

<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