Divided CGI process for making TTF file by fork function.
authorKoichi KAMICHI <kamichi@fonts.jp>
Mon, 27 Nov 2006 06:48:54 +0000 (06:48 +0000)
committerKoichi KAMICHI <kamichi@fonts.jp>
Mon, 27 Nov 2006 06:48:54 +0000 (06:48 +0000)
Cleaned up the sources.

makettf/index.html
makettf/makettf.cgi
makettf/makettf.pl

index 77433d6..dada1b8 100644 (file)
@@ -1,12 +1,15 @@
 <?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>TTF(TrueType)フォント生成 (試作)</title>
+<title>TTF(TrueType)フォント生成 (試作その2)</title>
 </head>
 <body>
+<div class="main">
 <h1>TTF(TrueType)フォント生成</h1>
+
 <form action="makettf.cgi" method="POST">
 フォント名(英語):<input type="text" name="fontname-en" value="Test" size="20"><br>
 フォント名(漢字):<input type="text" name="fontname-ja" value="テスト" size="20"><br>
 <br>
 <input type="submit" value="生成">
 </form>
-<hr>
-部品データは1部品=1行で、「部品名、スペース、部品データ」の順に記述します。<br>
+
+<h2>説明</h2>
+
+<p>部品データは 1部品ごとに1行 で、「部品名、スペース、部品データ」の順に記述します。<br>
 実際に生成されるコードポイントは、部品名が「単独の文字」「[単独の文字]」「コードポイント16進数(頭にUu,+-を付けても可)」のいずれかとなります。<br>
-「:」の含まれない行はコメントとして、無視されます。
+「:」の含まれない行はコメントとして、無視されます。コードポイントは現在はUCSにのみ対応しています。</p>
+
+<p>コードポイント指定例
 <ul>
-<li>(例)</li>
 <li>30A8</li>
 <li>U+30A8</li>
 <li>u30a8</li>
 <li>u-00020000</li>
 <li>一</li>
 <li>[壱]</li>
-</ul>
-<hr>
-注意<br>
-TrueTypeフォントを生成するソフトウェアfontforge の制約により、以下の条件を満たさない場合には生成したフォントをWord2002で利用できません。
+</ul></p>
+
+<p>「生成」ボタンをクリックするとフォントの生成が始まり、フォントをダウンロードするためのリンクが表示されます。データ量によって時間がかかりますので、しばらくお待ちください。生成されたフォントは不定期に削除されます(または別のデータに変更されます)ので早めにダウンロードしてください。
+
+<h2>注意</h2>
+
+<p>TrueTypeフォントを生成するソフトウェア Fontforge の制約により、以下の条件を満たさない場合には、生成したフォントを Microsoft Word 2002 で利用できません。</p>
+
 <dl>
 <dt>日本語フォント</dt><dd>U+30A8「(カタカナ)エ」を含めてください</dd>
 <dt>簡体字中国語フォント</dt><dd>U+3105「ボポモフォB」を含めてください</dd>
 <dt>繁体字中国語フォント</dt><dd>U+592E「央」を含めてください</dd>
 <dt>韓国語フォント</dt><dd>U+3131「ハングル字母1番目」を含めてください</dd>
 </dl>
-<br>
-Webサーバの制約により生成に6分以上かかる場合は失敗します。(現在グリフ数4000強までは生成が可能です)
-<hr>
-<div align="right">fonts.jp</div>
+
+<a href="http://fonts.jp/makettf/">戻る</a>
+
+<hr class="footer">
+fonts.jp
+</div>
 </body>
 </html>
 
index 85e8c6d..d412113 100755 (executable)
@@ -1,40 +1,60 @@
 #!/usr/bin/perl
+
+# 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;
 
-$FONTFORGE = "/usr/local/bin/fontforge";
-$PERL = "/usr/bin/perl";
-$RM = "/bin/rm";
-$LICENSE = 'Created by KAGE system. (http://fonts.jp/)';
-$TEMP="temp";
-
-$RANDOM = sprintf("%05X", rand() * 0x100000);
-$TEMPDIR = "/tmp/makettf_$RANDOM";
+# prepare working directory
+$RANDOM = sprintf("%07X", rand(0x10000000));
+$TEMPDIR = "$BASEDIR/$RANDOM";
+$TEMPURL = "$RANDOM";
 mkdir($TEMPDIR);
 
-&makehead();
-&makefoot();
-&makeparts();
-$dummy = `$PERL makettf.pl $TEMPDIR $TEMP mincho 3`;
-&sendfont();
+# main : divided for parent and child process
+$| = 1;
+$pid = fork();
+unless(defined $pid){
+  &makeerror();
+  exit;
+}
+if($pid > 0){
+  &makepage();
+} else{
+  close(STDIN);
+  close(STDOUT);
+  close(STDERR);
+  &makehead();
+  &makefoot();
+  &makeparts();
+  $dummy = `$MAKETTF $TEMPDIR $TEMP mincho 3`;
+}
+exit;
 
 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/head.txt";
-    print FH <<"EOT";
+  $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")
@@ -43,42 +63,70 @@ SetTTFName(0x409,4,"$fontname_en")
 SetTTFName(0x411,1,"$fontname_ja")
 SetTTFName(0x411,4,"$fontname_ja")
 EOT
-    close FH;
+  close FH;
 }
 
 sub makefoot{
-    open FH, ">:utf8", "$TEMPDIR/foot.txt";
-    close FH;
+  open FH, ">:utf8", "$TEMPDIR/$FOOTER_FILENAME";
+  close FH;
 }
 
 sub makeparts{
-    my $temp = $form->param('partsdata');
-    utf8::decode($temp);
-    open FH, ">:utf8", "$TEMPDIR/parts.txt";
-    print FH $temp;
-    close FH;
+  my $temp = $form->param('partsdata');
+  utf8::decode($temp);
+  open FH, ">:utf8", "$TEMPDIR/$PARTS_FILENAME";
+  print FH $temp;
+  close FH;
+}
+
+sub makepage{
+  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>以下のリンクをクリックしてください。リンクが切れている場合は生成中ですのでもう少しお待ちください。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
 }
 
-sub sendfont{
-    my $fdata = "";
-    my $fsize = 0;
-    my @bdata;
-    print <<"EOT";
-Content-type: application/octet-stream
-Content-Disposition: attachment; filename = $fontname_en.ttf
+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
-    binmode STDOUT => ":raw";
-    #open FH, "<:utf8", "$TEMPDIR/$TEMP.ttf";
-    open FH, "<$TEMPDIR/$TEMP.ttf";
-    while(1){
-       $readed = read FH, $fdata, 1024;
-       #utf8::decode($fdata);
-       print $fdata;
-       if($readed <= 0){
-           last;
-       }
-    }
-    close FH;
-    $dummy = `$RM -r $TEMPDIR`;
 }
index 7eb22bc..30a680f 100755 (executable)
@@ -1,4 +1,13 @@
 #!/usr/bin/perl
+
+$FONTFORGE = "export LANG=utf-8; /usr/bin/fontforge";
+$MAKEGLYPH = "/usr/bin/js ./makeglyph.js";
+$MV = "/bin/mv";
+$HEADER_FILENAME = "head.txt";
+$PARTS_FILENAME = "parts.txt";
+$FOOTER_FILENAME = "foot.txt";
+$TEMPNAME = "temp";
+
 use utf8;
 use CGI;
 binmode STDOUT, ":utf8";
@@ -10,8 +19,6 @@ if(scalar(@ARGV) != 4){
   exit;
 }
 
-$FONTFORGE = "/usr/local/bin/fontforge";
-$PERL = "/usr/bin/perl";
 $WORKDIR=$ARGV[0];
 $WORKNAME=$ARGV[1];
 $SHOTAI=$ARGV[2];
@@ -22,51 +29,9 @@ unlink "$WORKDIR/$WORKNAME.scr";
 unlink "$WORKDIR/$WORKNAME.ttf";
 mkdir "$WORKDIR/build";
 
-sub addglyph{
-    my $buffer =<<"EOT";
-Print(0u$_[0])
-Select(0u$_[0])
-Clear()
-Import("$WORKDIR/build/$_[0].svg")
-Scale(500)
-Move(400, -400)
-RemoveOverlap()
-Simplify()
-SetWidth(1000)
-Move(0, 50)
-RoundToInt()
-AutoHint()
-EOT
-    open FH, ">>:utf8", "$WORKDIR/$WORKNAME.scr";
-    print FH $buffer;
-    close FH;
-}
-
-sub makefont{
-    my $buffer = "Generate(\"$WORKDIR/$WORKNAME.ttf\", \"\", 0)\n";
-    $buffer .= "Quit()\n";
-    open FH, ">>:utf8", "$WORKDIR/$WORKNAME.scr";
-    print FH $buffer;
-    close FH;
-    
-    $buffer = `export LANG=utf-8; $FONTFORGE -script $WORKDIR/$WORKNAME.scr > $WORKDIR/$WORKNAME.log 2>&1`;
-    #open FH, ">>:utf8", "$WORKDIR/$WORKNAME.log";
-    #print FH $buffer;
-    #close FH;
-}
-
-sub addsubset{
-    $subset{$_[0]} = $buhin{$_[0]};
-    while($buhin{$_[0]} =~ m/(^|\$)99:[^:]*:[^:]*:[^:]*:[^:]*:[^:]*:[^:]*:(.+?)(\$|$)/gc){
-       if(!exists($subset{$2})){
-           &addsubset($2);
-       }
-    }
-}
-
 # initialize
-if(-e "$WORKDIR/head.txt"){
-  open FH, "<:utf8", "$WORKDIR/head.txt";
+if(-e "$WORKDIR/$HEADER_FILENAME"){
+  open FH, "<:utf8", "$WORKDIR/$HEADER_FILENAME";
   open FH2, ">>:utf8", "$WORKDIR/$WORKNAME.scr";
   while(!eof FH){
     my $buffer = <FH>;
@@ -84,8 +49,8 @@ else{
 
 # parse buhin
 %buhin = ();
-if(-e "$WORKDIR/parts.txt"){
-  open FH, "<:utf8", "$WORKDIR/parts.txt";
+if(-e "$WORKDIR/$PARTS_FILENAME"){
+  open FH, "<:utf8", "$WORKDIR/$PARTS_FILENAME";
   my $buffer = "";
   while(<FH>){
     $buffer .= $_;
@@ -140,7 +105,7 @@ foreach(sort(keys(%target))){
   utf8::encode($partsdata);
   $partsdata =~ s/([^0-9A-Za-z_ ])/'%'.unpack('H2',$1)/ge;
   $partsdata =~ s/\s/+/g;
-  $svg =  `/usr/bin/js makeglyph.js $target $partsdata $SHOTAI $WEIGHT`;
+  $svg =  `$MAKEGLYPH $target $partsdata $SHOTAI $WEIGHT`;
   open FH, ">$WORKDIR/build/$code.svg";
   print FH $svg;
   close FH;
@@ -148,8 +113,8 @@ foreach(sort(keys(%target))){
 }
 
 # scripts footer
-if(-e "$WORKDIR/foot.txt"){
-  open FH, "<:utf8", "$WORKDIR/foot.txt";
+if(-e "$WORKDIR/$FOOTER_FILENAME"){
+  open FH, "<:utf8", "$WORKDIR/$FOOTER_FILENAME";
   open FH2, ">>:utf8", "$WORKDIR/$WORKNAME.scr";
   while(!eof FH){
     my $buffer = <FH>;
@@ -166,3 +131,44 @@ else{
 }
 
 &makefont;
+
+sub addglyph{
+    my $buffer =<<"EOT";
+Print(0u$_[0])
+Select(0u$_[0])
+Clear()
+Import("$WORKDIR/build/$_[0].svg")
+Scale(500)
+Move(400, -400)
+RemoveOverlap()
+Simplify()
+SetWidth(1000)
+Move(0, 50)
+RoundToInt()
+AutoHint()
+EOT
+  open FH, ">>:utf8", "$WORKDIR/$WORKNAME.scr";
+  print FH $buffer;
+  close FH;
+}
+
+sub makefont{
+  my $buffer = "Generate(\"$WORKDIR/$TEMPNAME.ttf\", \"\", 0)\n";
+  $buffer .= "Quit()\n";
+  open FH, ">>:utf8", "$WORKDIR/$WORKNAME.scr";
+  print FH $buffer;
+  close FH;
+  
+  $buffer = `$FONTFORGE -script $WORKDIR/$WORKNAME.scr > $WORKDIR/$WORKNAME.log 2>&1`;
+  $buffer = `$MV $WORKDIR/$TEMPNAME.ttf $WORKDIR/$WORKNAME.ttf`;
+}
+
+sub addsubset{
+  $subset{$_[0]} = $buhin{$_[0]};
+  while($buhin{$_[0]} =~ m/(^|\$)99:[^:]*:[^:]*:[^:]*:[^:]*:[^:]*:[^:]*:(.+?)(\$|$)/gc){
+    if(!exists($subset{$2})){
+      &addsubset($2);
+    }
+  }
+}
+