HTML::AA 0.10 原文

「翻訳」ではなく「原文」なのは、私が作ったモジュールだからです。
HTML::AAモジュールのバージョンは0.10です。
なお、perlmanの内容とは異なります。次期バージョン(UTF-8対応予定)であわせます。
コードの説明は、PHPのHTML/AAパッケージの方が詳しいです。
構文はほぼ同じなので読み替えてください。

モジュールのバグについて

以下のような指摘を頂きましたので掲載しておきます。(2010-02-17記)

#  名無しさん Says:
2月 17th, 2010 at 2:49 PM e

エントリとは関係ないですが、バグ報告です。
PerlのHTML::AAにおいて、文字の0を数字とみなすことによって
エラーが発生します。
270 my @array;
271 while($str) {
272 $str =~ s/(.)//;

を

270 my @array;
271 while($str ne ”) {
272 $str =~ s/(.)//;
にするとうまくいきましたので、ご報告まで。

説明

HTML::AAPerlモジュールです。
AAアスキーアート(Ascii Art)と同じ要領で、アスキーアジャスト(Ascii Adjust)を行います。
このモジュールは、ブラウザに表示する文字列を整形する機能を有します。
アスキーアートほどの表現力はありませんが、文字列の横ピクセル数を計算したり、面倒な右揃え等の整形をすることが出来ます。
このモジュールは、UnitedDevicesの日報支援サイト「UD-Team2ch 404」を作ったことがきっかけです。
UTF-8への対応も予定しておりますので、しばらくお待ちください。
ご意見、ご感想は、モジュール内に記載されているメールアドレスまでお寄せください。
元はWWW::AAとして公開しておりましたが、カテゴリが違うという判断から0.10よりHTML::AAに変更いたしました。

特徴

罫線表示が必要な場合に有効な、指定サイズ(罫線の倍数)の倍数での最小サイズを求めるshorter_multipleを実装しています。

注意

エンコードはEUC-JP、Shift_JISに対応しています。
作者は英語が全然出来ないので、翻訳ソフトにかけた英文で記述されています。
解説は、このページが一番詳しく、判りやすいと思います。
文字コードが異なる場合には、正常な結果を得ることができません。
MS Pゴシック12ポイントで表示した場合に限り、正常に表示できると予想されます。
文字列の先頭に半角スペースが出力された場合、それが行頭になるとずれる現象が発生します。
詳しくは、アスキーアートを紹介しているサイト等を参考にしてください。
原則、日本語の文字(概ね2バイト文字)のみの入力においてのみ正常な動作を保証いたしますが、半角スペース以外は正常に動作することを確認しています。
文字列内に半角スペースの連続が混入している場合、表示の際にずれます。対策処理を検討中。

解説

アスキーコードで正規表現を利用していますが、主要な部分は次の通りです。
判別しやすいように、文字のままで表記しています。
これは、プロトタイプとしてJavaScriptで作成したものを少し修正したものです。

my $str  = shift;
my $count = 0;
$count += 15 * ($str =~ s/ー|M|m|あ|い|お|け|す|そ|ぞ|た|だ|つ|づ|に|ひ|び|ぴ|ん|ウ|オ|ガ|キ|ギ|グ|ケ|ゲ|ズ|セ|ダ|チ|ヂ|ヅ|デ|ナ|ニ|ネ|ヘ|ベ|ペ|ホ|ボ|ポ|ユ|ワ|ヴ//g);
$count += 14 * ($str =~ s/え|き|ぎ|ご|ざ|ち|ぢ|て|で|ど|な|ま|ゃ|ゅ|よ|る|ろ|ゎ|を|ア|エ|ゴ|シ|ジ|ス|ゾ|ツ|テ|ビ|ピ|ブ|プ|マ|モ|レ|ロ|ン//g);
$count += 13 * ($str =~ s/O|Q|ぃ|ぉ|ぐ|こ|っ|も|ら|イ|ォ|カ|ク|コ|ソ|ヌ|フ|ャ|ュ|ラ|ヲ//g);
$count += 12 * ($str =~ s/M|W|m|ヽ|ヾ|ゝ|B|C|D|G|H|K|N|R|S|U|w|ぁ|ぇ|さ|し|じ|と|ょ|り|ァ|ゥ|ェ|タ|ッ|ヒ|メ|ヨ|リ|ヮ|ヵ|ヶ//g);
$count += 11 * ($str =~ s/@|C|G|O|Q|サ|ム|ヤ|ル|、|。|,|.|ゞ|0|1|2|3|4|5|6|7|8|9|A|E|P|V|う|ド|ノ|ミ| //g);# ←最後に全角スペースがあります
$count += 10 * ($str =~ s/&|A|B|D|H|K|N|P|R|S|U|V|X|w|ー|ア|ウ|エ|オ|キ|ケ|ス|セ|チ|ツ|テ|ナ|ニ|ネ|ハ|ヘ|ホ|マ|モ|ユ|F|J|L|T|X|Y|Z|b|d|h|k|n|o|p|q|u|ぅ|ィ|ト|ョ//g);
$count +=  9 * ($str =~ s/E|F|J|L|T|Y|Z|a|c|e|g|s|く|ヲ|イ|カ|ク|コ|シ|ソ|タ|ヌ|フ|ラ|レ|ロ|ワ|ン//g);
$count +=  8 * ($str =~ s/a|b|c|d|e|h|n|o|p|q|u|v|y|"|#|$|%|*|+|-|/|0|1|2|3|4|5|6|7|8|9|<|=|>|\|ァ|ゥ|ェ|ォ|ャ|ュ|ッ|ノ|ヒ|メ|ヨ|リ|・|:|;|゛|゜|´|`|¨|^|‐|‘|’|“|”|(|)|〔|〕|[|]|{|}|〈|〉|《|》|「|」|『|』|【|】|†|‡|¶|v|x|y|z//g);
$count +=  7 * ($str =~ s/?|^|`|g|k|s|x|z|~|「|」|・|ィ|ョ|ト|ミ|。|、//g);
$count +=  6 * ($str =~ s/r|t|r//g);
$count +=  5 * ($str =~ s/(|)|[|]|_|f|f|t| //g);# ←最後に半角スペースがあります
$count +=  4 * ($str =~ s/!|I|j|{|||}|゙|゚|I|i|j|l//g);
$count +=  3 * ($str =~ s/'|,|.|:|;|i|l//g);
$count += 16 * ($str =~ s/../g);
return $count;

文字とそのドット数(ピクセル数)の関連性は、「アスキーアート」で検索したページで、解説が見つかると思います。

使い方(EUC-JPの場合)

use HTML::AA;
my $aart = new HTML::AA;
#------------------- モジュールが処理をする文字コードを指定します。EUC-JPならuec、Shift_JISならsjis
$aart -> code('euc');
my $dot;
my $str = '整形したい文字列です。';
my @str = ('整形したい文字列です。','このような感じで整形することが出来ます。');
print  qq|Content-type: text/html; charset=EUC-JPnn|;
print  qq|<body>n|;
print  qq|HTML::AAのサンプルです。<br>n|;
#------------------- 文字列のドット数を求める
print  qq|<br>n文字列のドット数を求める<br>n|;
# 文字コードを引数で指定する場合
$dot = $aart -> calcu($str, 'euc');
printf qq|「%s」のドット数は、%dです。<br>n|, $str, $dot;
#------------------- 指定したドット数で整形する(undefではなく''空値を指定すること)
print  qq|<br>n指定したドット数で整形する<br>n|;
# $strと''の間に調整ドットを右寄せで整形
printf qq|│%s│<br>n|, $aart -> adjust($str, '', 'R', 350);
# $strと''の間に調整ドットを左寄せで整形
printf qq|│%s│<br>n|, $aart -> adjust($str, '', 'L', 350);
# ''と$strの間に調整ドットを右寄せで整形
printf qq|│%s│<br>n|, $aart -> adjust('', $str, 'R', 350);
# ''と$strの間に調整ドットを左寄せで整形
printf qq|│%s│<br>n|, $aart -> adjust('', $str, 'L', 350);
# $strと$strの間に調整ドットを右寄せで整形
printf qq|│%s│<br>n|, $aart -> adjust($str, $str, 'R', 350);
# $strと$strの間に調整ドットを左寄せで整形
printf qq|│%s│<br>n|, $aart -> adjust($str, $str, 'L', 350);
#------------------- 配列内の文字列が揃う最小のドット数を求める
print  qq|<br>n配列内の文字列が揃う最小のドット数を求める<br>n|;
$dot = $aart -> shorter(@str);
printf qq|│%s│<br>n|, $aart -> adjust($_, '', 'R', $dot) foreach @str;
printf qq|│%s│<br>n|, $aart -> adjust($_, '', 'L', $dot) foreach @str;
printf qq|│%s│<br>n|, $aart -> adjust('', $_, 'R', $dot) foreach @str;
printf qq|│%s│<br>n|, $aart -> adjust('', $_, 'L', $dot) foreach @str;
print qq|</body>n|;

結果は次のとおりです。

HTML::AAのサンプルです。

文字列のドット数を求める
「整形したい文字列です。」のドット数は、162です。

指定したドット数で整形する

│整形したい文字列です。                   .│
│整形したい文字列です。.                   │
│                   .整形したい文字列です。│
│.                   整形したい文字列です。│
│整形したい文字列です。 .....整形したい文字列です。│
│整形したい文字列です。..... 整形したい文字列です。│

配列内の文字列が揃う最小のドット数を求める

│整形したい文字列です。             .│
│このような感じで整形することが出来ます。│
│整形したい文字列です。.             │
│このような感じで整形することが出来ます。│
│             .整形したい文字列です。│
│このような感じで整形することが出来ます。│
│.             整形したい文字列です。│
│このような感じで整形することが出来ます。│

動作サンプル

サンプル

補足

各バージョンごとに使い方が変わると思います。ご注意ください。
$aart -> code(‘euc’);で文字コードを指定しない場合は、初期値のEUC-JPで処理されます。
宣言は何度でも行えます。その宣言は、それより後の処理で使用される文字コードに反映されます。
個別にコードを指定する使用方法があります。興味のある方はソースを見てください。

インストール方法

プロンプトにて、「cpan install HTML::AA」とすることでインストールできます。
または、CPANよりダウンロードできます

おまけ(Excite翻訳にかける前の原文)

#-------------------------------------------------------------------------------
# モジュール宣言
#-------------------------------------------------------------------------------
sub new {}
#-------------------------------------------------------------------------------
# 文字コードを宣言します
#-------------------------------------------------------------------------------
my $code = 'euc';
#-------------------------------------------------------------------------------
# モジュールが処理する文字コードを宣言します
# 文字コードを指定しない呼び出しで有効です
# EUC-JPで処理したいならeuc
# $aart -> code('euc');
# Shift_JISで処理したいならsjis
# $aart -> code('sjis');
#-------------------------------------------------------------------------------
sub code {}
#-------------------------------------------------------------------------------
# ドット数を計算します
# $aart -> calcu($str);
#-------------------------------------------------------------------------------
sub calcu {}
# 文字コード宣言を無視してEUC-JPで処理したい時
# $aart -> calcu_euc($str);
sub calcu_sjis {}
# 文字コード宣言を無視してShift_JISで処理したい時
# $aart -> calcu_sjis($str);
sub calcu_sjis {}
#-------------------------------------------------------------------------------
# 文字列の変数を1文字の配列に分解します
# $aart -> divide($str);
#-------------------------------------------------------------------------------
sub divide {}
# 文字コード宣言を無視してEUC-JPで処理したい時
# $aart -> divide_euc($str);
sub divide_euc {}
# 文字コード宣言を無視してShift_JISで処理したい時
# $aart -> divide_sjis($str);
sub divide_sjis {}
#-------------------------------------------------------------------------------
# 調整ドットを加えた文字列を返します
# $aart -> adjust($str_l, $str_r, position, $size);
#-------------------------------------------------------------------------------
sub adjust {}
# 配置'R'と文字コード宣言を無視してEUC-JPで処理したい時
# $aart -> adjust_right_euc($str_l, $str_r, $size);
sub adjust_right_euc {}
# 配置'L'と文字コード宣言を無視してEUC-JPで処理したい時
# $aart -> adjust_left_euc($str_l, $str_r, $size);
sub adjust_left_euc {}
# 配置'R'と文字コード宣言を無視してShift_JISで処理したい時
# $aart -> adjust_right_sjis($str_l, $str_r, $size);
sub adjust_right_sjis {}
# 配置'L'と文字コード宣言を無視してShift_JISで処理したい時
# $aart -> adjust_left_sjis($str_l, $str_r, $size);
sub adjust_left_sjis {}
#-------------------------------------------------------------------------------
# 配列の文字列が揃う最小ドット数を返します
# $aart -> shorter(@array);
#-------------------------------------------------------------------------------
sub shorter {}
# 文字コード宣言を無視してEUC-JPで処理したい時
# $aart -> shorter_euc(@array);
sub shorter_euc {}
# 文字コード宣言を無視してShift_JISで処理したい時
# $aart -> shorter_sjis(@array);
sub shorter_sjis {}
#-------------------------------------------------------------------------------
# 配列の文字列が揃う指定された数の倍数に当たる最小ドット数を返します
# ($minimun, $magnification) = $aart -> shorter_multiple($width, @arrayL, @arrayR);
#-------------------------------------------------------------------------------
sub shorter_multiple {}
# 文字コード宣言を無視してEUC-JPで処理したい時
# ($minimun, $magnification) = $aart -> shorter_multiple_euc($width, @arrayL, @arrayR);
sub shorter_multiple_euc {}
# 文字コード宣言を無視してShift_JISで処理したい時
# ($minimun, $magnification) = $aart -> shorter_multiple_sjis($width, @arrayL, @arrayR);
sub shorter_multiple_sjis {}

更新履歴

2010-02-17
バグの指摘を掲載
2008-04-03
サイト移動に伴うHTMLの修正(旧URI:[廃止])
2006-10-10
WWW::AAというカテゴリがおかしいと判明したので、HTML::AAに変更 バージョンを0.10
2006-10-04
動作速度が向上するように変更 バージョン0.06
2006-10-09
エスケープシーケンスを1文字としていたのを除去(文字列から削除)に変更。Shift_JISに対応。バージョン0.05
2006-10-04
翻訳の見直しと共に、原文を掲載。ローカルのファイルでは文字列を1文字の配列にする機能を追加。
2006-09-29
WWW::AAサンプルを追加
2006-09-28
コメントをばっさり削除、エラーが出ないように補正、見た目の修正と、コメントの強化などで0.02にバージョンアップ
2006-09-27
プロトタイプとしてWWW:AA0.01をCPANに登録

GD::Arrow 0.01 妙日本語訳

この妙日本語訳はエキサイト翻訳:英語翻訳を利用しつつ、のーみそコネコネして作成しました。
GD::Arrowモジュールのバージョンは0.01です。

目次

名前

GD::Arrow – GDを利用して矢印を描画する

概略

use GD;
use GD::Arrow;
my $width = 8;
my ($x1, $y1) = (100, 10);
my ($x2, $y2) = (100, 190);
my ($x3, $y3) = (10, 30);
my ($x4, $y4) = (190, 75);
my $arrow = GD::Arrow::Full->new( 
                -X1    => $x1, 
                -Y1    => $y1, 
                -X2    => $x2, 
                -Y2    => $y2, 
                -WIDTH => $width,
            );
my $image = GD::Image->new(200, 200);
my $white = $image->colorAllocate(255, 255, 255);
my $black = $image->colorAllocate(0, 0, 0);
my $blue = $image->colorAllocate(0, 0, 255);
my $yellow = $image->colorAllocate(255, 255, 0);
$image->transparent($white);
$image->filledPolygon($arrow,$blue);
$image->polygon($arrow,$black);
my $half_arrow_1 = GD::Arrow::LeftHalf->new( 
                       -X1    => $x3, 
                       -Y1    => $y3, 
                       -X2    => $x4, 
                       -Y2    => $y4, 
                       -WIDTH => $width,
                   );
my $half_arrow_2 = GD::Arrow::LeftHalf->new( 
                       -X1    => $x4, 
                       -Y1    => $y4, 
                       -X2    => $x3, 
                       -Y2    => $y3, 
                       -WIDTH => $width 
                   );
$image->filledPolygon($half_arrow_1,$blue);
$image->polygon($half_arrow_1,$black);
$image->filledPolygon($half_arrow_2,$yellow);
$image->polygon($half_arrow_2,$black);
open IMAGE, "> image.png" or die $!;
binmode(IMAGE, ":raw");
print IMAGE $image->png;
close IMAGE;
exit(0);

説明

これは2点の間に矢を描くのに使用される、GD::polygonのサブクラスです。
GD::Arrow::Full 2点の間に完全な矢を描きます。
                                  |\
           +----------------------+ \
  (X2, Y2) *                         * (X1, Y1)
           +----------------------+ /
                                  |/
GD::Arrow::RightHalf 2点の間に半分の矢を描きます。
  (X2, Y2) *-------------------------* (X1, Y1)
           +----------------------+ /
                                  |/
GD::Arrow::LeftHalf 2点の間に半分の矢を描きます。
                                  |\
           +----------------------+ \
  (X2, Y2) *-------------------------* (X1, Y1)

参照

GD::Polygon

クレジット

The equations used to determine the critical verticies to represent a GD::Arrow
2点からGD::Arrowのために使用される方程式は、オノヒデキのmakefeedmapソフトウェアに基づいています。
Makefeedmapは、http://www.ono.org/software/makefeedmap/で参照することができます。

作者

Todd Caine, <todd@pobox.com>

Copyright 2004 by Todd Caine
このライブラリはフリーソフトウェアです。
Perlと同じ条件で再配布、または変更することが出来ます。

更新履歴

2008-04-03
サイト移動に伴うHTMLの修正(旧URI:[廃止])
2006-06-13
公開