|
|
1.1 ! root 1: <?php ! 2: // ! 3: // BDF ファイルから必要な範囲だけ抜き出す ! 4: // Copyright (C) 2012 [email protected] ! 5: // ! 6: ! 7: /* ! 8: * 書式 ! 9: * bdfcut.php [command] < in.bdf > out.bdf ! 10: * ! 11: * 解説 ! 12: * BDF ファイルから必要な範囲だけを抜き出します。 ! 13: * 標準入力から読み込み、標準出力に書き出します。 ! 14: * ! 15: * 範囲は command で指定します。今のところ以下が使用できます。 ! 16: * ! 17: * h : Unicode の BDF からひらがなのみを抜き出します。 ! 18: * k : JISX0208 の BDF から非漢字のみを抜き出します。 ! 19: */ ! 20: ! 21: $opt = $argv[1]; ! 22: ! 23: $start = -1; ! 24: $end = -1; ! 25: ! 26: /* オプションによって出力範囲を指定 */ ! 27: if ($opt == "h") { ! 28: /* Unicode のひらがなのみ取り出す */ ! 29: $start = 0x3041; ! 30: $end = 0x309f; ! 31: } ! 32: if ($opt == "k") { ! 33: /* JIS X 0208 の非漢字のみ取り出す */ ! 34: $start = 0x2120; ! 35: $end = 0x287f; ! 36: } ! 37: ! 38: /* どのオプションもなければ終了 */ ! 39: if ($start == -1) { ! 40: fprintf(STDERR, "usage: {$argv[0]} [command] < in.bdf > out.bdf\n"); ! 41: fprintf(STDERR, " h: hiragana only in unicode\n"); ! 42: fprintf(STDERR, " k: hi-kanji only in JIS X 0208\n"); ! 43: exit(1); ! 44: } ! 45: ! 46: /* ! 47: * プロパティ部分。 ! 48: * o TTF から縦横比を変えて変換した BDF には QUAD_WIDTH が含まれてない ! 49: * ので、ついでにここで追加してやる。 ! 50: */ ! 51: $pixel_size = -1; ! 52: $quad_width = -1; ! 53: $res_x = -1; ! 54: $res_y = -1; ! 55: while (($buf = fgets(STDIN))) { ! 56: if (preg_match("/^PIXEL_SIZE (\d+)/", $buf, $m)) { ! 57: $pixel_size = $m[1] + 0; ! 58: ! 59: } else if (preg_match("/^QUAD_WIDTH (\d+)/", $buf, $m)) { ! 60: $quad_width = $m[1] + 0; ! 61: ! 62: } else if (preg_match("/^RESOLUTION_X (\d+)/", $buf, $m)) { ! 63: $res_x = $m[1] + 0; ! 64: ! 65: } else if (preg_match("/^RESOLUTION_Y (\d+)/", $buf, $m)) { ! 66: $res_y = $m[1] + 0; ! 67: ! 68: } else if (preg_match("/^ENDPROPERTIES/", $buf)) { ! 69: /* h モードで QUAD_WIDTH がなければ作成 */ ! 70: if ($opt == "h" && $quad_width == -1) { ! 71: if ($pixel_size > 0 && $res_x > 0 && $res_y > 0) { ! 72: $quad_width = intval($pixel_size * $res_x / $res_y); ! 73: print "QUAD_WIDTH {$quad_width}\n"; ! 74: } else { ! 75: fprintf(STDERR, "Warning: cannot generate QUAD_WIDTH\n"); ! 76: } ! 77: } ! 78: ! 79: /* ここで自身も出力して終了 */ ! 80: print $buf; ! 81: break; ! 82: } ! 83: print $buf; ! 84: } ! 85: ! 86: /* 本体ループ */ ! 87: $body = ""; ! 88: $ischar = false; ! 89: $num = 0; ! 90: while (($buf = fgets(STDIN))) { ! 91: if ($ischar) { ! 92: $body .= $buf; ! 93: ! 94: /* ENDCHAR を書き出したら一旦終わり */ ! 95: if (preg_match("/^ENDCHAR/", $buf)) { ! 96: $ischar = false; ! 97: } ! 98: ! 99: } else if (preg_match("/^STARTCHAR ([\d\w]+)/", $buf, $m)) { ! 100: list($code) = sscanf($m[1], "%x"); ! 101: if ($start <= $code && $code <= $end) { ! 102: $body .= $buf; ! 103: $ischar = true; ! 104: $num++; ! 105: } ! 106: } ! 107: } ! 108: ! 109: /* 文字数とともに残りを出力 */ ! 110: print "CHARS {$num}\n"; ! 111: print "{$body}"; ! 112: ?>
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.