Fixed. Emphasizing the error data.
[chise/kage.git] / makettf / makettf.cgi
index 9354620..d259910 100755 (executable)
@@ -1,67 +1,60 @@
 #!/usr/bin/perl
-use utf8;
-use CGI;
 
-$FONTFORGE = "/usr/local/bin/fontforge";
-$PERL = "/usr/bin/perl";
-$ECHO = "/bin/echo";
-$RM = "/bin/rm";
-$TEMP = "/tmp/tempKAGE";
-$KAGESCRIPT = "/home/kamichi/perl";
-$FMT = "svg";
+# definition
+$BASEDIR = "/var/www/makettf";
+$MAKETTF = "/usr/bin/perl $BASEDIR/makettf.pl";
 $LICENSE = 'Created by KAGE system. (http://fonts.jp/)';
+$TEMP="font";
+$HEADER_FILENAME = "head.txt";
+$PARTS_FILENAME = "parts.txt";
+$FOOTER_FILENAME = "foot.txt";
 
+# initialize
+use utf8;
+binmode STDOUT, ":utf8";
+use CGI;
 $form = new CGI;
 
-$fontname_en = $form->param('fontname-en');
-$fontname_en =~ s/[\;\&\#\"\'\%\\\$\:\!\=\~\^\`]//g;
-$fontname_ja = $form->param('fontname-ja');
-$fontname_ja =~ s/[\;\&\#\"\'\%\\\$\:\!\=\~\^\`]//g;
-utf8::decode($fontname_ja);
-if($fontname_en eq ""){
-    $fontname_en = "Untitled";
-}
-if($fontname_ja eq ""){
-    $fontname_ja = $fontname_en;
-}
+# prepare working directory
+$RANDOM = sprintf("%07X", rand(0x10000000));
+$TEMPDIR = "$BASEDIR/$RANDOM";
+$TEMPURL = "$RANDOM";
+mkdir($TEMPDIR);
 
-#open FH, "<", "parts.txt";
-#$temp = "";
-#%parts = ();
-#foreach(<FH>){
-#    $temp .= $_;
-#    @temp = split(/ \t|\r\n|\r|\n/, $_);
-#    $parts{$temp[0]} = $temp[1];
-#}
-#close FH;
-@temp2 = split(/\r\n|\r|\n/, $partsdata);
-$temp = "";
-%parts = ();
-foreach(@temp2){
-    $temp .= $_;
-    @temp = split(/ |\t|\r\n|\r|\n/, $_);
-    $parts{$temp[0]} = $temp[1];
+# main : divided for parent and child process
+$| = 1;
+$pid = fork();
+unless(defined $pid){
+  &makeerror();
+  exit;
 }
-open FH, ">", "$TEMP.parts.txt";
-$temp =~ s/ /\t/g;
-print FH $temp;
-close FH;
-
-#open FH, "<", "map.txt";
-#%map = ();
-#foreach(<FH>){
-#    @temp = split(/\t|\r\n|\r|\n/, $_);
-#    $map{$temp[0]} = $temp[1];
-#}
-#close FH;
-@temp2 = split(/\r\n|\r|\n/, $mappingtable);
-%map = ();
-foreach(@temp2){
-    @temp = split(/ |\t|\r\n|\r|\n/, $_);
-    $map{$temp[0]} = $temp[1];
+if($pid > 0){
+  &makepage();
+} else{
+  close(STDIN);
+  close(STDOUT);
+  close(STDERR);
+  &makehead();
+  &makefoot();
+  &makeparts();
+  $dummy = `$MAKETTF $TEMPDIR $TEMP mincho 3`;
 }
+exit;
 
-$script =<<"EOT";
+sub makehead{
+  $fontname_en = $form->param('fontname-en');
+  $fontname_en =~ s/[\;\&\#\"\'\%\\\$\:\!\=\~\^\`]//g;
+  $fontname_ja = $form->param('fontname-ja');
+  $fontname_ja =~ s/[\;\&\#\"\'\%\\\$\:\!\=\~\^\`]//g;
+  utf8::decode($fontname_ja);
+  if($fontname_en eq ""){
+    $fontname_en = "Untitled";
+  }
+  if($fontname_ja eq ""){
+    $fontname_ja = $fontname_en;
+  }
+  open FH, ">:utf8", "$TEMPDIR/$HEADER_FILENAME";
+  print FH <<"EOT";
 New()
 Reencode("UnicodeFull")
 SetTTFName(0x409,0,"$LICENSE")
@@ -70,53 +63,71 @@ SetTTFName(0x409,4,"$fontname_en")
 SetTTFName(0x411,1,"$fontname_ja")
 SetTTFName(0x411,4,"$fontname_ja")
 EOT
+  close FH;
+}
 
-foreach(sort(keys %map)){
-    $temp = $parts{$map{$_}};
-    $dummy = `cd $KAGESCRIPT; $ECHO '$temp' | $PERL $KAGESCRIPT/kagepre.pl $TEMP.parts.txt | $PERL $KAGESCRIPT/kage$FMT.pl > $TEMP.$_.$FMT`;
-    &addglyph($_);
+sub makefoot{
+  open FH, ">:utf8", "$TEMPDIR/$FOOTER_FILENAME";
+  close FH;
 }
-&makefont;
 
-sub addglyph{
-    $script .=<<"EOT";
-Select(0u$_[0])
-Clear()
-Import("$TEMP.$_[0].$FMT")
-#Import("$TEMP.$_[0].$FMT",0,2)
-RemoveOverlap()
-Simplify()
-SetWidth(1000)
-SetVWidth(1000)
-Move(0, 50)
-RoundToInt()
-AutoHint()
-EOT
+sub makeparts{
+  my $temp = $form->param('partsdata');
+  utf8::decode($temp);
+  open FH, ">:utf8", "$TEMPDIR/$PARTS_FILENAME";
+  print FH $temp;
+  close FH;
 }
 
-sub makefont{
-    $script .= "Generate(\"$TEMP.ttf\", \"\", 0)\n";
-    $script .= "Quit()\n";
-    open FH, ">:utf8", "$TEMP.scr";
-    print FH $script;
-    close FH;
-    
-    $dummy = `export LANG=utf-8; $FONTFORGE -script $TEMP.scr 2>/dev/null`;
-    
-    my $fdata = "";
-    my $fsize = 0;
-    my @bdata;
-    open FH, "<$TEMP.ttf";
-    $fsize = -s FH;
-    read FH, $fdata, $fsize;
-    close FH;
-    print <<"EOT";
-Content-type: application/octet-stream
-Content-Disposition: attachment; filename = $fontname_en.ttf
+sub makepage{
+  print <<"EOT";
+Content-type: text/html;
 
-$fdata
+<!DOCTYPE html
+    PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
+    "http://www.w3.org/TR/html4/loose.dtd">
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+<link rel="stylesheet" type="text/css" href="http://fonts.jp/green.css">
+<html>
+<head>
+<title>フォントダウンロード</title>
+</head>
+<body>
+<div class="main">
+<h1>フォント生成中</h1>
+<p>以下のリンクをクリックしてください。リンクが切れている場合は生成中ですのでもう少しお待ちください。6000グリフで25分程度かかります。</p>
+<p><a href="$TEMPURL/$TEMP.ttf">フォントのダウンロード</a></p>
+<p><a href="$TEMPURL/$TEMP.log">生成ログ</a>(しばらくすると、ここに処理したグリフのUCSコードポイントが記録されます。通常の漢字は0u4E00から0u9FA5の間で、0u4E00から処理されます。0u9XXXまで到達せずに更新が止まった場合はデータにエラーがあり失敗している可能性があります。</p>
+<p><a href="index.html">戻る</a></p>
+<hr class="footer">
+fonts.jp
+</div>
+</body>
+</html>
 EOT
-    
-    $dummy = `$RM $TEMP*`;
 }
 
+sub makeerror{
+print <<"EOT";
+Content-type: text/html;
+
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+<link rel="stylesheet" type="text/css" href="http://fonts.jp/green.css">
+<html>
+<head>
+<title>フォント生成失敗</title>
+</head>
+<body>
+<div class="main">
+<h1>フォント生成失敗</h1>
+<p>もう一度戻ってやり直してください。</p>
+<p><a href="index.html">戻る</a></p>
+<hr class="footer">
+fonts.jp
+</div>
+</body>
+</html>
+EOT
+}