SSSp.pm - スタイル切替の為のフレームワーク
use SSSp;
$obj = SSSp->new($conf);
$set_cookie = $obj->make_cookie; # Set-Cookie ヘッダ
$meta = $obj->make_cookie(1); # cookie_tmpl より生成
$link = $obj->make_link; # link_tmpl より生成
$form = $obj->make_form; # スタイル選択フォーム
サーバサイドで Web ページのスタイルを簡単に切り替えられるようにする為のフレームワークです。
本クラスのオブジェクトは以下のインスタンス属性を持ちます。
属性名 | デフォルト値 |
---|---|
default_style | undef |
header_indent | \n\t |
selected_style | アクセスメソッドの項を参照 |
style | {} |
style_order | ASCII 順 |
cookie_domain | $ENV{'SERVER_NAME'} |
cookie_expires | 30 |
cookie_flag | 0 |
cookie_name | SSSSelectedStyle |
cookie_path | $ENV{'SCRIPT_NAME'} より取得 or / |
cookie_tmpl | アクセスメソッドの項を参照 |
form_ctrl_name | SSSStyle |
form_replace_words | アクセスメソッドの項を参照 |
form_selected_attr | selected="selected" |
form_select_tmpl | アクセスメソッドの項を参照 |
form_tmpl | アクセスメソッドの項を参照 |
link_alt_enable | 0 |
link_rel_alt_value | Alternate Stylesheet |
link_rel_value | Stylesheet |
link_tmpl | アクセスメソッドの項を参照 |
特にことわりがない限り、コンストラクタ new 以外は全てインスタンスメソッドです。
make_cookie([FLAG])
選択されたスタイルをブラウザに保存させる為の Cookie を生成して返します。 FLAG とインスタンス属性 cookie_flag に指定されたフラグ値で生成内容が変わります。
bit | OFF | ON |
---|---|---|
3 | Set-Cookie | Set-Cookie2 |
2 | Weekday | Wdy |
1 | HTTP ヘッダ | cookie_tmpl を使用 |
# Set-Cookie: style=Foo; expires=Tue, 01-Apr-2003 12:40:05 GMT
print $obj->make_cooke(2);
# <meta http-equiv="Set-Cookie2" content="style=Foo; Max-Age=2592000" />
print $obj->make_cooke(5);
make_form([WORD => VALUE [, WORD => VALUE [...]]])
make_form([EXPR])
スタイル選択フォームを生成して返します。指定できる引数は form_replace_words メソッドと同等で、 make_form メソッドに渡された値が優先的に使われます。
make_link
選択されたスタイルを文書にリンクさせる要素を生成して返します。
new([KEY => VALUE [, KEY => VALUE [...]]])
new([EXPR])
コンストラクタです。生成するインスタンスに持たせる属性値か、 設定ファイルのパスを引数に与える事ができます。
設定ファイルは Perl スクリプトそのもので、最後に返される値が、 属性名とその値のハッシュリファレンスでなければいけません。 各属性のデフォルト値を最大限利用した、最も単純な設定ファイルは以下のようになります;
#--- sssp.conf ---
{
default_style => 'Foo',
style => {
Foo => { href => '/~you/css/foo.css' },
Bar => { href => '/~you/css/bar.css' },
Baz => { href => '/~you/css/baz.css' },
},
};
#-----------------
特にことわりがない限り、以下に挙げる関数は、 同名のインスタンス属性に対する読み書き両用のアクセスメソッドです。
$obj = $obj->method($value);
$value = $obj->method;
cookie_domain([EXPR])
Cookie を適用させるドメインです。 デフォルト値は環境変数 SERVER_NAME の値になります。
a.example.org と b.example.org の両方で利用できる Cookie を出力したい場合、
cookie_domain には .example.org
を指定して下さい。
cookie_expires([EXPR])
Cookie の賞味期限で、単位は日です。
デフォルト値は 30
日です。
cookie_flag([EXPR])
make_cookie メソッドの
FLAG に加えられる値です。
デフォルト値は 0
です。
cookie_name([EXPR])
Cookie に保存するスタイル名のキーです。
デフォルト値は SSSSelectedStyle
です。
cookie_path([EXPR])
Cookie を適用させるパスです。
デフォルト値は環境変数 SCRIPT_NAME からプログラム名を除いたものか
/
になります。
cookie_tmpl([EXPR])
Cookie をエンティティボディ内に出力する際のテンプレートです。 デフォルト値は以下のような XHTML テキストです;
<meta http-equiv="__NAME__" content="__COOKIE__" />
テンプレート中に含まれる文字列 __NAME__
はインスタンス属性
cookie_name の値に、
__COOKIE__
は生成された Cookie テキストにそれぞれ置換されます。
default_style([EXPR])
陽に指定されなかった時に適用されるスタイル名です。
form_ctrl_name([EXPR])
クライアントからスタイル名を受け取る際のコントロール名です。
デフォルト値は SSSStyle
です。
form_replace_words([WORD => VALUE [, WORD => VALUE [...]]])
form_replace_words([EXPR])
スタイル選択フォームのテンプレート中に含まれる、
__
で挟まれた文字列 WORD と、
それを置換するテキスト VALUE の設定です。
WORD に使える文字はアルファベットと
_
(アンダーバー) のみです。大文字小文字を区別しませんが、
テンプレート中には大文字で記述しなければいけません。
また、アンダーバーは先頭及び末尾には使えず、連続してもいけません。
デフォルトで以下のペアが設定されます;
WORD | VALUE |
---|---|
ACTION | $ENV{'SCRIPT_NAME'} |
METHOD | post |
CTRL_NAME | インスタンス属性 form_ctrl_name |
PATH | $ENV{'DOCUMENT_URI'} |
form_selected_attr([EXPR])
スタイル選択フォームでの選択肢で、「選択」状態にする為の文字列です。
デフォルト値は selected="selected"
です。
form_select_tmpl([EXPR])
スタイル選択フォームでの選択肢のテンプレートです。 デフォルト値は以下のような XHTML テキストです;
<option__SELECTED__>__NAME__</option>
テンプレート中に含まれる文字列 __SELECTED__
はインスタンス属性
form_selected_attr の値か空文字列に、
__NAME__
はスタイル名にそれぞれ置換されます。
form_tmpl([EXPR])
スタイル選択フォームのテンプレートです。 デフォルト値は以下のような XHTML (1.0 Transitional) テキストです;
<form action="__ACTION__" method="__METHOD__">
<div>
<select id="__CTRL_NAME__" name="__CTRL_NAME__">
__SELECT__
</select>
<input type="hidden" id="from" name="from" value="__PATH__" />
<input type="submit" value="Apply" />
</div>
</form>
テンプレート中に含まれる __
で挟まれた文字列は、基本的に
インスタンス属性 form_replace_words
に指定されたテキストで置換されます。
__SELECT__
はインスタンス属性
form_selected_attr 及び
form_select_tmpl
の値から生成されたテキストで置換されます。
header_indent([EXPR])
インスタンス属性 link_alt_enable
の値が真の時、make_link
メソッドで複数生成されるリンク要素の間に挟まれる文字列です。
デフォルト値は \n\t
です。
link_alt_enable([EXPR])
選択されなかったスタイルを、
代替スタイルとしてリンクするか否かの真偽値フラグです。
デフォルト値は 0
(代替スタイルを出力しない) です。
link_rel_alt_value([EXPR])
スタイルシートをリンクさせる要素で、
代替スタイルシートである事を宣言する為の文字列です。
デフォルト値は Alternate Stylesheet
です。
link_rel_value([EXPR])
スタイルシートをリンクさせる要素で、
適用されるスタイルシートである事を宣言する為の文字列です。
デフォルト値は Stylesheet
です。
link_tmpl([EXPR])
スタイルシートをリンクさせる要素のテンプレートです。 デフォルト値は以下のような XHTML テキストです;
<link rel="__REL__" href="__HREF__" title="__TITLE__" type="text/css" />
テンプレート中に含まれる __
で挟まれた文字列は、
基本的にインスタンス属性 style
で定義された各スタイルの設定値に置換されます。
__REL__
はインスタンス属性
link_rel_value の値か
link_rel_alt_value の値に、
__TITLE__
はスタイル名にそれぞれ置換されます。
style メソッドの項も参照して下さい。
selected_style([EXPR])
現在選択されているスタイル名です。 陽に設定する前に読み出すと以下の順番で指定を探し、 得た値を設定して返します;
style([NAME => ATTR [, NAME => ATTR [...]]])
style([EXPR])
各スタイルの設定です。
スタイルの定義には、スタイル名 NAME と、 そのスタイルの設定を収めたハッシュリファレンス ATTR のペアを指定します。
$obj->style(Foo => { href => '/~you/css/foo.css', media => 'screen' });
キー href
の値はインスタンス属性 link_tmpl
に指定されたテンプレート中の __HREF__
を、
キー media
の値は __MEDIA__
を、というように、
それぞれ対応する文字列に当てはめられます。
キーに使える文字はアルファベットと
_
(アンダーバー) のみです。大文字小文字を区別しませんが、
テンプレート中には大文字で記述しなければいけません。
また、アンダーバーは先頭及び末尾には使えず、連続してもいけません。
キーが全くないスタイルを定義する事で、「スタイルを使用しない」 という選択肢を作る事ができます;
$obj->style('No Style' => {});
スタイル名のみ指定して呼び出すと、そのスタイルの全設定を返します。
%attr = $obj->style('Foo'); # リストで返される
$attr = $obj->style('Foo'); # ハッシュリファレンスで返される
style_order([LIST])
スタイルシートをリンクさせる要素や、 スタイル選択フォームで各要素を並べる順番です。 デフォルト値はインスタンス属性 style に定義されているスタイル名を ASCII 順に並べたものです。
以下は Apache での挙動です。他の httpd ではどうなるか調べていません。
exec cgi では、プログラムのパスに直接クエリを付ける事ができません。 httpd が SSI 文を解釈する時点でエラーにされてしまいます。 include virtual ではこれが可能で、通常通り環境変数 QUERY_STRING を介してデータを受け取る事ができます。
<!--#exec cgi="./cmd.cgi?foo=bar"--> <!-- ERROR -->
<!--#include virtual="./cmd.cgi?foo=bar"--> <!-- OK -->
exec cgi でクエリを使って渡すには、SSI 文が埋め込まれている文書自身の URL にクエリを付ける必要があります;
https://example.org/~you/index.shtml?foo=bar
こう指定すれば、exec cgi でも include virtual でも、 環境変数 QUERY_STRING_UNESCAPED からクエリを受け取る事ができます。
exec cgi では文書の URL にクエリを付けた場合、QUERY_STRING_UNESCAPED
だけでなく QUERY_STRING の方にも同じ値が入ります。include virtual
では文書の URL に付けたクエリは QUERY_STRING_UNESCAPED だけに、
プログラムのパスに付けたクエリは QUERY_STRING だけに入るので、
両方のクエリを使い分けて柔軟に指定できます。また、include virtual
は Options +IncludesNoExec
下でも利用できます。
本スクリプトは Piro 氏作の CGI-SSS を参考に作成されました。デフォルト値の幾つかは CGI-SSS を意識しています。
CGI-SSS 配布元: outsider reflex
Copyright © 2003 Yaminusi. <yn@byor.org> All Rights Reserved.
一次配布元: BYOR
本スクリプトは修正 BSD ライセンスにて公開されています。