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