7eb22bc1c35e3421fdcfc4aa56a51374b6bf9c6e
[chise/kage.git] / makettf / makettf.pl
1 #!/usr/bin/perl
2 use utf8;
3 use CGI;
4 binmode STDOUT, ":utf8";
5
6 if(scalar(@ARGV) != 4){
7   print "Usage: makettf.pl WorkingDirectory WorkingName Shotai Weight\n";
8   print "Shotai: mincho or gothic\n";
9   print "Weight: 1 3 5 7\n";
10   exit;
11 }
12
13 $FONTFORGE = "/usr/local/bin/fontforge";
14 $PERL = "/usr/bin/perl";
15 $WORKDIR=$ARGV[0];
16 $WORKNAME=$ARGV[1];
17 $SHOTAI=$ARGV[2];
18 $WEIGHT=$ARGV[3];
19
20 unlink "$WORKDIR/$WORKNAME.log";
21 unlink "$WORKDIR/$WORKNAME.scr";
22 unlink "$WORKDIR/$WORKNAME.ttf";
23 mkdir "$WORKDIR/build";
24
25 sub addglyph{
26     my $buffer =<<"EOT";
27 Print(0u$_[0])
28 Select(0u$_[0])
29 Clear()
30 Import("$WORKDIR/build/$_[0].svg")
31 Scale(500)
32 Move(400, -400)
33 RemoveOverlap()
34 Simplify()
35 SetWidth(1000)
36 Move(0, 50)
37 RoundToInt()
38 AutoHint()
39 EOT
40     open FH, ">>:utf8", "$WORKDIR/$WORKNAME.scr";
41     print FH $buffer;
42     close FH;
43 }
44
45 sub makefont{
46     my $buffer = "Generate(\"$WORKDIR/$WORKNAME.ttf\", \"\", 0)\n";
47     $buffer .= "Quit()\n";
48     open FH, ">>:utf8", "$WORKDIR/$WORKNAME.scr";
49     print FH $buffer;
50     close FH;
51     
52     $buffer = `export LANG=utf-8; $FONTFORGE -script $WORKDIR/$WORKNAME.scr > $WORKDIR/$WORKNAME.log 2>&1`;
53     #open FH, ">>:utf8", "$WORKDIR/$WORKNAME.log";
54     #print FH $buffer;
55     #close FH;
56 }
57
58 sub addsubset{
59     $subset{$_[0]} = $buhin{$_[0]};
60     while($buhin{$_[0]} =~ m/(^|\$)99:[^:]*:[^:]*:[^:]*:[^:]*:[^:]*:[^:]*:(.+?)(\$|$)/gc){
61         if(!exists($subset{$2})){
62             &addsubset($2);
63         }
64     }
65 }
66
67 # initialize
68 if(-e "$WORKDIR/head.txt"){
69   open FH, "<:utf8", "$WORKDIR/head.txt";
70   open FH2, ">>:utf8", "$WORKDIR/$WORKNAME.scr";
71   while(!eof FH){
72     my $buffer = <FH>;
73     print FH2 $buffer;
74   }
75   close FH;
76   close FH2;
77 }
78 else{
79   open FH, ">>:utf8", "$WORKDIR/$WORKNAME.log";
80   print FH "No header file.\n";
81   close FH;
82   exit;
83 }
84
85 # parse buhin
86 %buhin = ();
87 if(-e "$WORKDIR/parts.txt"){
88   open FH, "<:utf8", "$WORKDIR/parts.txt";
89   my $buffer = "";
90   while(<FH>){
91     $buffer .= $_;
92   }
93   close FH;
94   $temp = $buffer;
95 }
96 else{
97   open FH, ">>:utf8", "$WORKDIR/$WORKNAME.log";
98   print FH "No parts file.\n";
99   close FH;
100   exit;
101 }
102 @temp = split(/\r\n|\r|\n/, $temp);
103 foreach(@temp){
104   if($_ =~ m/:/){
105     @temp2 = split(/ +|\t/, $_);
106     $buhin{$temp2[0]} = $temp2[1];
107   }
108 }
109
110 # parse target codepoint
111 %target = ();
112 foreach(sort(keys %buhin)){
113   if($_ =~ m/^\[([^\]])\]$/){
114     $target = sprintf("%X", unpack('U', $1));
115   } elsif(length($_) == 1){
116     $target = sprintf("%X", unpack('U', $_));
117   } elsif($_ =~ m/^[Uu]{0,1}[\+\-]{0,1}([0-9A-Fa-f]{1,8})$/){
118     $target = $1;
119   } else {
120     next;
121   }
122   $target =~ s/^0+//g; # delete zero for the beginning
123   $name = $_;
124   $target{$target} = $name;
125 }
126
127 # make glyph for each target
128 foreach(sort(keys(%target))){
129   $code = $_;
130   $target = $target{$_};
131   %subset = ();
132   &addsubset($target);
133   $partsdata = "";
134   foreach(keys(%subset)){
135     $partsdata .= $_." ".$subset{$_}."\n";
136   }
137   utf8::encode($target);
138   $target =~ s/([^0-9A-Za-z_ ])/'%'.unpack('H2',$1)/ge;
139   $target =~ s/\s/+/g;
140   utf8::encode($partsdata);
141   $partsdata =~ s/([^0-9A-Za-z_ ])/'%'.unpack('H2',$1)/ge;
142   $partsdata =~ s/\s/+/g;
143   $svg =  `/usr/bin/js makeglyph.js $target $partsdata $SHOTAI $WEIGHT`;
144   open FH, ">$WORKDIR/build/$code.svg";
145   print FH $svg;
146   close FH;
147   &addglyph($code);
148 }
149
150 # scripts footer
151 if(-e "$WORKDIR/foot.txt"){
152   open FH, "<:utf8", "$WORKDIR/foot.txt";
153   open FH2, ">>:utf8", "$WORKDIR/$WORKNAME.scr";
154   while(!eof FH){
155     my $buffer = <FH>;
156     print FH2 $buffer;
157   }
158   close FH;
159   close FH2;
160 }
161 else{
162   open FH, ">>:utf8", "$WORKDIR/$WORKNAME.log";
163   print FH "No footer file.\n";
164   close FH;
165   exit;
166 }
167
168 &makefont;