2014年1月20日月曜日

[Glaeja] ♫迷い道くねくね

『Glaeja』ver.4.5.0から、カレンダー系エスケープキャラクタ「$...$」の『基準日時』をイジれるようになりました。

…で、『基準日時』ってなに?

というわけで、「$...$」における『基準日時』について以下に解説します。


基準日時とは


『Glaeja』では、ウィジェットの描画更新が開始された瞬間の日時を(ミリ秒単位まで)内部に保存しており、そのウィジェット内の全レイヤー・全文字列の解析で現れる「$...$」に保存してある同じ日時を用いています。

この保存してある日時のことを『基準日時』と呼びます。

同じ基準日時を用いることによって、どれだけレイヤーが多くなり、処理が重くなっても、全てのレイヤーで同じ日時が展開・表示されることが保証されます。


$...$」で基準日時をズラす


ver.4.5.0より前のバージョンにおいて、「昨日の曜日」を取得しようとした場合、
  1. caladd@x@」を使って「昨日」をスタックにプッシュ
  2. mjd@x@」で修正ユリウス通日に変換
  3. それを 7 で割った余りから曜日に対応する数値を求めて
  4. @.../.../\m@」で曜日の文字列表記にする
という複雑な手順を踏まなければなりませんでした。

ver.4.5.0からは「$...$」の内部で一時的に基準日時をズラすことができるようになりました。

$...$」内に以下の文字があった場合、その文字より後ろの文字は全てズラされた基準日時から展開されるようになります。
  • b : 文字数分の 日数 だけ基準日時を 過去へ ズラす
  • B : 文字数分の 日数 だけ基準日時を 未来へ ズラす
  • v : 文字数分の 週数 だけ基準日時を 過去へ ズラす
  • V : 文字数分の 週数 だけ基準日時を 未来へ ズラす
  • n : 文字数分の 月数 だけ基準日時を 過去へ ズラす
  • N : 文字数分の 月数 だけ基準日時を 未来へ ズラす
  • x : 文字数分の 年数 だけ基準日時を 過去へ ズラす
  • X : 文字数分の 年数 だけ基準日時を 未来へ ズラす

例えば、大元の基準日時が「2014/01/20(月)01:23」の場合、
  • $bMM/dd(E) HH:mm$01/19(日) 01:23
  • $bbMM/dd(E) HH:mm$01/18(土) 01:23
  • $BBBMM/dd(E) HH:mm$01/23(木) 01:23
  • $vMM/dd(E) HH:mm$01/13(月) 01:23
  • $VVMM/dd(E) HH:mm$02/03(日) 01:23
  • $nyyyy/MM/dd(E) HH:mm$2013/12/20(金) 01:23
  • $Nyyyy/MM/dd(E) HH:mm$2014/02/20(木) 01:23
  • $xxyyyy/MM/dd(E) HH:mm$2012/01/20(金) 01:23
  • $XXyyyy/MM/dd(E) HH:mm$2016/12/20(水) 01:23

と展開されます。

このズレた基準日時は、これらの文字が記述された$...$内部でだけ有効で、別の$...$では大元の基準日時が使用されます。
  • $bMM/dd(E) HH:mm$ $MM/dd(E) HH:mm$01/19(日) 01:23 01/20(月) 01:23

また、記述された同じ$...$内でも、その記述より前のエスケープキャラクタには適用されません。
  • $MM/dd(E) HH:mm bMM/dd(E) HH:mm$01/20(月) 01:23 01/19(日) 01:23


calset@x@」で半恒久的に基準日時を設定する


上述した「$b$」等は、基準日時のズレが同じ「$...$」内に限られていました。これはこれで安全でイイのですが、異なった「$...$」で同じように基準日時をズラすのに何度も「bb...」と記述するのは面倒です。

そこで、同じ文字列内なら異なる「$...$」でも基準日時をズラし続けられるよう「calset@x@」があります。

calset@x@」は、スタック最上段の数値を「$yyyyMMddHHmm$」形式の日時と見なして、この文字列全体に適用される基準日時を設定します。

例えば、大元の基準日時が「2014/01/20(月)01:23」の場合、
  • $MM/dd$ 201401230000@0/12/\p@calset@0/6/\x@ $MM/dd$01/20  01/23
  • 201401230000@p@calset@x@$MM/dd$ $E$01/23 木

と、「calset@x@」より後ろの「$...$」全ての基準日時がズレます。

ただし、「calset@x@」を使っても、異なるレイヤーにある文字列や、同じレイヤー内でも違う文字列(例えば「色と透過度」にある4つの文字列)には、ズレた基準日時は適用されません

ちなみに、「$yyyyMMddHHmm$」で指定できない「秒/ミリ秒」の値は、元の基準日時のものがそのまま使われます。


calorg@x@」で基準日時を戻す


上述した「calset@x@」は、以降の「$...$」全ての基準日時がズレます。これを戻すのには「calorg@x@」を用います。

「calorg@x@」は、ズラされる前の元の基準日時を「$yyyyMMddHHmm$」形式で数値としてスタックにプッシュします。

よって、「calorg@x@calset@x@」と連続して使用することで、基準日時を元に戻すことができます。

…「calorg@x@」一発で基準日時を戻せない理由は、まぁアレです、「整合性」ってやつですw
この点に関しては「一発で戻せるようにして」という要望は一切聞き入れませんので悪しからず。

以上

0 件のコメント:

コメントを投稿