Sep 08, 2009

Perl/Tk で縦書きビューワーを作ろう (1)

今すぐ出来るところから始めてみようと思って、とりあえず Perl/Tk を使って縦書き表示部分だけパパッと書いてみました。

IPAフォント使用時のぽちたて表示部サムネイル

ボロボロなものでもとにかくでっち上げて、「こんなの作ってるんですよ~?」とアピールして、物知らずなぽちよりもっとスゴイ方々から色々とお知恵を拝借しよう、なんて虫の良い事を考えていたりします。自力で勉強してキチンとしたものを作れたらそれが一番なのですけども…。

pochitate20090908.pl

#!/usr/bin/perl

use strict;
use warnings;
use utf8;
use Tk;

my $font_family            = 'IPA明朝';
my $font_size              = 12;
my $font_style             = 'normal';
my $text_width             = 450;
my $text_height            = 46;
my $line_horizontal_margin = 26;
my $chr_vertical_margin    = 16;

my $top = MainWindow->new( -title => 'ぽちたて' );
my $canvas = $top->Canvas( width => 481, height => 561 );
$canvas->pack();
$canvas->create( 'rectangle', 1, 1, 480, 560,
                 -fill => 'green', -stipple => 'gray25' );

while(<>){
    utf8::decode($_);
    my $chr_height = $text_height;
    my @string = split(//, $_);
    for my $chr (@string){
        $canvas->create( 'text', $text_width, $chr_height, -text => $chr,
                         -font => [ $font_family, $font_size, $font_style ] );
        $chr_height += $chr_vertical_margin;
    }
    $text_width -= $line_horizontal_margin;
}

MainLoop();

test.txt

 たてがきテスト

縦書きテスト                 犬山ぽち丸

  タテガキてすと

 何文字くらいが限界なのか試してみたけど、まだ折り返しの方法
を良く検討していなかったりします。何とか折り返しの良い方法が
無いものでしょうか…。
 さらには一番肝心な縦書きグリフの呼び出し方も分かりません。
 とりあえずは縦書き表示の基本部分を作ってみたものの、テキス
トファイルの読み込みや折り返しや一画面分表示の前処理について
もっとキチンと考えないと、全く使い物になりません。
 問題は山積み過ぎてどれから手を付けていいのやらという状態。
 しかし、一文字づつ配列に放り込んで縦書き表示させるなんて乱
暴な仕組みで実現したけど、これってテキストデータが膨大な量に
なっても大丈夫なのかとっても不安です。

test.txt を引き数に与えて、実行権限を付けた pochitate20090908.pl を実行したのが一番上の画像になります。当面の問題は、

  • マルチバイト文字列の折り返し
  • 複数ページに渡るテキストデータの表示
  • 縦書きフォントの取得と表示

という感じです。

ちゃんと調べたわけではありませんが、マルチバイト文字列の折り返しには Lingua::JA::Fold が、縦書きフォントの取得と表示では Font::FreeTypeFont::TTF::GSUB あたりが使えたら良いなあ…なんて思っていたりします。

Posted at 19:57 in perl | Comments/Trackbacks ()
Comments/Trackbacks
TrackBack ping me at
http://pochi.usamimi.info/blog/perl/PerlTk_tategaki1.
Post a comment

writeback message: