2011年10月31日月曜日

[Glaeja] かたつむり

…というわけで、『Glaeja』の前方文字置換エスケープキャラクタ「@...@」のチュートリアルです。

ver.1.5.0以降のバージョンアップでは、このキャラクタがかなり拡張されてるんですが、
拡張されすぎて、その記述方法と方向性が迷走してますw

なので、整理も兼ねてチュートリアルを書いてみたいと思います。

目次


@...@」の基本的な記法

@...@」は、それよりも左側の文字列(の一部)を、別の文字列に置換するためのエスケープキャラクタです。

@...@」エスケープキャラクタを用いて、
  • 左側文字列の「どこの部分」を   … 該当部分文字列
  • 「どのような文字列」に置換するか … 置換文字列
を記述します。

@...@」エスケープキャラクタは、基本的には以下のように記述します。

@(開始文字位置)/(文字列長)/(置換文字列)@

「開始文字位置」と「文字列長」の2つにより「該当部分文字列」を決定します。


開始文字位置


「開始文字位置」は、最初の@の1つ左の文字をゼロ文字目とし、以降左へ1文字ごとに、1, 2, ... と増えていきます。

    • abcde@0/2/XYZ@ → abcXYZ
    • abcde@2/1/XYZ@ → abXYZde

負の数が与えられた場合、それはゼロと見なされます。
    • abcde@-1/1/XYZ@ → abcdXYZ

特殊文字として「\P」が記述されていた場合、スタックからポップされ整数化された数値が開始文字位置として用いられます。
    • 1@p@abcde@\P/2/XYZ@ → abXYZe

\P」以外の数値ではない文字列が与えられた場合はエラーと見做され、このエスケープキャラクタによる置換はおこなわれません。
    • abcde@a/2/XYZ@ → abcde

与えられた正の整数が文字列長以上の場合(つまり、文字列先頭を超える場合)にもエラーと見なされ、このエスケープキャラクタによる置換はおこなわれません。
    • abcde@5/1/XYZ@ → abcde


文字列長


 「文字列長」は、開始文字位置にある文字を1文字目として、左へ何文字分を置換対象とするかを表す数値です。

    • abcde@1/2/XYZ@ → abXYZe

-1」が与えられた場合、文字列長は左側にある文字列の先頭までと見なされます。また、文字列先頭から開始文字位置までの文字数を超える場合にも、 文字列長は元文字列の先頭までと見なされます。
    • abcde@1/-1/XYZ@ → XYZe
    • abcde@1/10/XYZ@ → XYZe

特殊文字として「\P」が記述されていた場合、スタックからポップされ整数化された数値が文字列長として用いられます。
    • 3@p@abcde@1/\P/XYZ@ → aXYZe

※ 開始文字位置と文字列長の2つに同時に「\P」を記述することも可能です。その場合、スタックから最初に開始文字位置がポップされ、次に文字列長がポップされます。
    • 2@p@1@p@abcde@\P/\P/XYZ@ → abXYZe

-1」以外の負の整数、および「\P」以外の数値ではない文字列が与えられた場合はエラーと見なされ、このエスケープキャラクタによる置換はおこなわれません。
    • abcde@1/a/XYZ@ → abcde

ゼロを与えた場合、開始文字位置で示される文字の右隣に置換文字列が挿入されます。
    • abcde@1/0/XYZ@ → abcdXYZe

※ 開始文字位置および文字列長は、日本語でも正しく文字数が数えられます。
    • 日本語@1/1/ほん@ → 日ほん語


置換文字列


「置換文字列」は、上記した開始文字位置と文字列長で示される該当部分文字列に代わって表示される文字列を与えます。

@.../.../@]のように、置換文字列として空文字列を与えた場合はエラーと見なされ、このエスケープキャラクタによる置換はおこなわれません。
    • abcde@1/2/@ → abcde

また「\d」のように、バックスラッシュ「\」(機種やフォントによっては半角円記号「\」)で始まる「特殊置換文字」を与えた場合には、後述するような特殊な文字列操作がおこなわれます。
ただし、実装されていない特殊置換文字だった場合はエラーと見なされ、このエスケープキャラクタによる置換はおこなわれません。


@...@」の糖衣構文

@...@」を記述する際に、「@.../.../...@」と開始文字位置と文字列長を記述するのは正直面倒です。そこで記述が簡単になるような糖衣構文が用意されています。

1文字記法


@...@」では、直前の文字から文字列先頭までを該当部分文字列とする「@0/-1/...@」という表現が頻出します。そこで、これを簡単に記述するための糖衣構文が「1文字記法」です。

「1文字記法」は、2つの「@」の囲まれた文字が1文字だけとなる記法で、その文字の前に0/-1/\”が自動的に補完されて解釈されます。

例えば、「abcd@A@」は「abcd@0/-1/\A@」と補完された後に解釈され、その結果として「ABCD」と展開されます。

この「1文字記法」は、2つの「@」に囲まれた文字が1文字であれば、どのような文字でも補完されます。


2文字記法


この「2文字記法」は、2つの「@」の囲まれた文字が2文字だけとなるもので、該当部分文字列の範囲(開始文字位置と文字列長)をある条件で自動補完する糖衣構文です。

@xy@」と記述されていた場合、
  • 特殊置換文字は “y”
  • 開始文字位置は「0(ゼロ)
  • 文字列長は、最初の「@」から文字列先頭までの範囲で最も右に現れる文字 “x” の1つ左の文字まで
  • 上記した文字を削除してから解釈
となります。

例えば、「ab:cde:fgh@:A@」という文字列は、最初の「@」から文字列先頭までの範囲で最も右に現れる ”:” は「e:f」の部分の ”:” であり、該当部分文字列はその ”:” の1つ右の文字 ”f” までなので “fgh” となります。
解釈前にこの ”:” だけが削除されますので、この文字列は結果的に「ab:cdefgh@0/3/\A@」として解釈されることになります。

この「2文字記法」は、2つの「@」に囲まれた文字列が2文字であれば、どのような文字の組み合わせでも補完・解釈されます。

このことは、区切り文字として機能する「2文字の1文字目」の種類によっては、文法的には正しいが結果として意味をなさない、という場合があることを示唆しています。

どういうことかというと、例えば、「@.../.../\m@」は該当部分文字列をコンマ ”,” で区切った並びのうちのある位置の文字列を残して他を削除する、というものなのですが、これに対して「1@p@ab,cd,ef,gh@,m@」という記述は結果としては意味をなさないわけです。


3文字記法


この「3文字記法」は、2つの「@」の囲まれた文字が3文字だけとなるもので、該当部分文字列の範囲(開始文字位置と文字列長)を「2文字記法」より柔軟に自動補完する糖衣構文です。
@xyz@」と記述されていた場合、
  • 特殊置換文字は “z”
  • 開始文字位置は、最初の「@」から文字列先頭までの範囲で最も右に現れる文字 “x” の1つ右の文字まで
  • 文字列長は、上記開始文字位置から文字列先頭までの範囲で最も右に現れる文字 “y” の1つ左の文字まで
  • 上記した2つの文字 “x” “y” を削除してから解釈
となります。

例えば、
    • ab[cde]fg@][A@ → abCDEfg

となります。要するに「y” と ”x” で囲まれた部分が該当部分文字列」となるわけです。

ここで、「 ”y” と ”x” は各々『最も右』で見つかった位置が用いられる」ことに注意してください。つまりネストした構造は思ったように解釈されない、ということになります。
    • a[b[cde]f]g@][A@ → abCDEFg(※ aBCDEFg ではないことに注意)

最初の「@」から文字列先頭までに ”x” も ”y” も見つからない場合には、「@0/-1/\"z"@」と解釈されます。
    • abcdefg@][A@ → ABCDEFG

最初の「@」から文字列先頭までに ”x” が見つからない場合には、最初の「@」の直前に ”x” があるものとして解釈されます。
    • abc[defg@][A@ → abcDEFG

見つかった ”x” から文字列先頭までに ”y” が見つからない場合には、文字列先頭に ”y” があるものとして解釈されます。
    • abcd]efg@][A@ → ABCDefg


特殊置換文字

@...@」の置換文字列に、バックスラッシュ「\」(機種やフォントによっては半角円記号「\」)で始まる「特殊置換文字」を与えた場合、以下のような特殊な操作がおこなわれます。

以下に、操作分類ごとの特殊置換文字と、おこなわれる操作について記します。


文字列操作をおこなう特殊置換文字


「文字列操作」に分類される特殊置換文字は、該当部分文字列に対して文字列操作をおこない、その結果と置換します。

\a:該当部分文字列の小文字化

\A:該当部分文字列の大文字化


該当部分文字列を全て小文字化・大文字化します。
    • ABCDEFG@2/3/\a@ → ABcdeFG
    • abcdefg@2/3/\A@ → abCDEfg


\b:バックスラッシュエスケープの変換


該当部分文字列に含まれる「バックスラッシュエスケープ文字」を対応する制御コードに変換します。

例えば、該当部分文字列中の "\t" という2文字を「水平タブ(ASCIIコード 0x09)」1文字に置換する、というものです。

使用可能なバックスラッシュエスケープ文字と制御コードの対応は以下のとおりです。
  • "\\" → バックスラッシュ("\")
  • "\a", "\A" → ベル(ASCIIコード 0x07)
  • "\b", "\B" → バックスペース(ASCIIコード 0x08)
  • "\t", "\T" → 水平タブ(ASCIIコード 0x09)
  • "\n", "\N" → 改行(ASCIIコード 0x0A)
  • "\v", "\V" → 垂直タブ(ASCIIコード 0x0B)
  • "\f", "\F" → 改頁(ASCIIコード 0x0C)
  • "\r", "\R" → 復帰(ASCIIコード 0x0D)
  • "\e", "\E" → エスケープ(ASCIIコード 0x1B)
  • "\s", "\S" → 空白(ASCIIコード 0x20)
  • "\u", "\U" → 後ろ4文字を16進数と見做し対応するUTF-8文字に置換
  • "\x", "\X" → 後ろ2文字を16進数と見做し対応するASCIIコードに置換

\B:制御コードの整形


該当部分文字列に含まれる制御コードを画面描画用に整形します。

例えば、該当部分文字列に水平タブ制御コード "\t" が含まれていたなら、それをタブマーク位置に応じた数の半角空白文字に置換する、というものです。

使用可能な制御コードと整形処理は以下のとおりです。
  • バックスペース(ASCIIコード 0x08) → 直前の1文字を削除
  • 水平タブ(ASCIIコード 0x09) → タブマーク位置に応じて最大4文字の半角空白文字(ASCIIコード 0x20)に置換
  • 改行(ASCIIコード 0x0A) → 何もしないで制御コードをそのまま出力
  • 垂直タブ(ASCIIコード 0x0B) → この行の制御コードまでの桁数を維持して改行
  • 抹消(ASCIIコード 0x7F) →直後の1文字を削除
上記以外の制御コードは削除されます。

水平タブ制御コードの整形について例をあげると、以下のようなテキストファイル「HorTab.txt」を、







「マルチラインテキスト」レイヤーで「@.../.../\B@」で整形して等幅フォントを使って表示すると、














このように表示されます。

この 「@.../.../\B@」ではタブは半角空白文字に置換されますので、当然ですが、プロポーショナルフォントを使った場合にはタブマーク位置が崩れて表示されてしまいます。

垂直タブ制御コードについては、「01234567\nABCD\vEFGH」という文字列を「@.../.../\b@」でバックスラッシュエスケープ文字を制御コードに変換した後、「@.../.../\B@」で整形して等幅フォントを使って表示すると、以下のように表示されます。















\c:該当部分文字列の1文字置換

\C:該当部分文字列の全文字置換


スタックの最上段にある数値を文字コードとする文字を "c2"、および次の段にある数値を文字コードとする文字を "c1"として(どちらも小数の場合は切り捨てて整数化)、以下の操作をおこないます。
  • \c」の場合は該当部分文字列中で最も左にある文字 "c1" を文字 "c2" に置換
  • \C」の場合は該当部分文字列中の全ての文字 "c1" を文字 "c2" に置換

例えば、大文字の "A" はASCIIコード「65(10進数)」、小文字の "a" はASCIIコード「97(10進数)」ですので、以下のような置換がおこなわれます。
    • 97@p@65@p@a dog and a cat@0/-1/\c@ → A dog and a cat
    • 97@p@65@p@a dog and a cat@0/-1/\C@ → A dog And A cAt

また、文字 "c2" の文字コードとして「0」を与えると、文字 "c1" の削除として機能します。
    • 97@p@0@p@a dog and a cat@0/-1/\c@ →  dog and a cat
    • 97@p@0@p@a dog and a cat@0/-1/\C@ →  dog nd  ct

文字コードにはASCIIコードだけではなくUTF-8も使用できます。例えば、UTF-8では "男"(0x7537、10進数で30007)、"漢"(0x6F22、10進数で28450)ですので、以下のように置換されます。
    • 30007@p@28450@p@男の中の男だ@0/-1/\c@ → 漢の中の男だ
    • 30007@p@28450@p@男の中の男だ@0/-1/\C@ → 漢の中の漢だ

\d:該当部分文字列の削除


該当部分文字列を削除します。
    • abcde@1/2/\d@ → abe

\D:該当部分文字列以外の削除


該当部分文字列以外を削除します。
    • abcde@1/2/\D@ → cd

\e:該当部分文字列を数値とみなして英数字に変換


該当部分文字列を数値(ゼロ以上の整数)と見なし、それを1文字ずつ英語表現に変換して置換します。
    • 123@0/-1/\e@ → one two three

該当部分文字列がゼロで始まる場合、そのゼロも変換されます。
    • 0123@0/-1/\e@ → zero one two three

該当部分文字列が負および実数だった場合、エラーと見なされ変換はおこなわれません。


\E:該当部分文字列を数値とみなして英語表現に変換


該当部分文字列を数値(ゼロ以上の整数)と見做し、それを英語表現に変換して置換します。
    • 123@0/-1/\E@ → one hundred twenty-three

該当部分文字列がゼロで始まる場合、そのゼロはないものとして扱われます。
    • 0123@0/-1/\E@ → one hundred twenty-three

ただし、 該当部分文字列がゼロそのものであった場合には、「zero」と変換されます。
    • 0@0/-1/\E@ → zero

該当部分文字列が負および実数だった場合、エラーと見なされ変換はおこなわれません。


\f:該当部分文字列をファイル名とするテキストファイルからスタック最上段の数値の示す行を取得


該当部分文字列を「com.gmail.kanitawa.glaeja/images」内にあるテキストファイル名と見なし、そのテキストファイルから、スタックの最上段にある数値(小数の場合は切り捨てて整数化)の示す行の内容に置換します。
※ 該当部分文字列が拡張子を含まない場合、自動的に「.txt」が付加されます。

テキストファイルの行区切りは「\r(CR)」「\n(LF)」「\r\n(CR+LF)」のいずれかで、テキストファイルの最初の行は「ゼロ行目」と数えられます。

com.gmail.kanitawa.glaeja/images」下に「test.txt」とファイル名で、『1234\r\nabcdefg\r\nあいうえお』という内容のテキストファイルがある場合、以下のように置換されます。
    • 0@p@test@0/-1/\f@ → 1234
    • 2@p@test@0/-1/\f@ → あいうえお

該当部分文字列と同じ名前のファイルが存在しない場合、およびスタックの最上段にある数値がテキストファイルの全行数より大きかった場合、該当部分文字列の削除のみおこわれます。
    • 0@p@foo@0/-1/\f@ → (文字列なし)
    • 3@p@test@0/-1/\f@ → (文字列なし)

スタックの最上段にある数値が「-1」だった場合、テキストファイルの全内容に置換されます。このときファイル内の行区切りは全て「\n」に置換されます。
※ 「-1」以外の負の数だった場合、該当部分文字列の削除のみおこわれます。
    • -1@p@test@0/-1/\f@ → 1234\nabcdefg\nあいうえお

\F:該当部分文字列をファイル名とするテキストファイルの全内容を取得


該当部分文字列を「com.gmail.kanitawa.glaeja/images」内にあるテキストファイル名と見なし、そのテキストファイルの全内容に置換します(つまり「-1@p@...@0/-1/\f@」と同じ)。該当部分文字列が拡張子を含まない場合、自動的に「.txt」が付加されます。


\g:該当部分文字列を数列と見なし、スタックからポップした値が存在する区間位置に置換する


該当部分文字列をコンマ "," で区切って数列と見なした上で、スタックからポップした値が、その数列のどの区間に存在するか、という位置に該当部分文字列全体を置換する。

区間の判定は、数列の一番左の数値を0番目、その次の数値を1番目、さらに次の数値を2番目...とした場合、
  • (0番目以上 かつ 1番目未満)もしくは(0番目以下 かつ 1番目を超える)場合、「1
  • (1番目以上 かつ 2番目未満)もしくは(1番目以下 かつ 2番目を超える)場合、「2
  •  ...
となります。
    • 10@p@0,10,20,30@0/-1/\g@ → 2
    • 12@p@0,10,20,30@0/-1/\g@ → 2
    • 12@p@30,20,10,0@0/-1/\g@ → 2
    • 10@p@30,20,10,0@0/-1/\g@ → 3

数列の全ての区間内でなかった場合には、「0」に置換されます。
    • 41@p@0,10,20,30@0/-1/\g@ → 0
    • -3@p@0,10,20,30@0/-1/\g@ → 0

ここで、『数列の並び順で、前の数値は「含む(以上/以下)」が、後の数値は「含まない(未満/超える)」』ことに注意してください。
例えば、バッテリー残量の20%毎に対応させようとして、「#P#@p@0,20,40,60,80,100@0/-1/\g@」と記述した場合、(10%1)(70%4)と正しく機能しますが、(100%0)となってしまいます。これは数列の最後が「100」であるため、「100未満」が区間内と見なされるためです。これを防ぐためには、数列最後を「101」のように明示的に大きくしておく必要があります。


数列内の複数箇所で区間が見つかる場合、最も左位置で見つかった区間の位置に置換されます。
    • 12@p@30,20,10,0,10,20,30@0/-1/\g@ → 2

該当部分文字列内に数値と見なせない文字列があった場合、それは「0」として扱われます。
また、スタックが空だった場合には、「0」がポップされたものとして扱われます。

数列を構成する数値が1つしかない場合、ポップした数値がそれに等しければ「1」、そうでなければ「0」に置換されます。
    • 10@p@10@0/-1/\g@ → 1
    • 12@p@10@0/-1/\g@ → 0

\h該当部分文字列を16進数と見なして10進数に変換

\H該当部分文字列を10進数と見なして16進数に変換


該当部分文字列を数値(ゼロ以上の整数)と見なし、10⇔16進数に変換します。
\H」で10→16進数に変換する際に負および実数だった場合、変換も該当部分文字列の削除もおこなわれません。
\h」 で16→10進数に変換する際は、2の補数による変換はおこなわれず、常に正の整数に変換されます。

\i:該当部分文字列の先頭文字の文字コードをスタックにプッシュ


該当部分文字列の先頭文字の文字コード(UTF-8)をスタックにプッシュします。
※ このとき部分文字列は削除(置換)されません。

例えば、小文字の "a" , "b" は、文字コード「97」「98」(10進数)ですので、以下のように動作します。
    • abcde@0/5/\i@.0@0/2/\P@ → abcde97
    • abcde@0/4/\i@.0@0/2/\P@ → abcde98

\I:スタックからポップした文字コードの文字が該当部分文字列内で最も右で見つかった位置をスタックにプッシュ


スタックからポップした数値を文字コード(UTF-8)とする文字が、該当部分文字列中で最も右で見つかった位置を、該当部分文字列末尾からゼロ始まりで数えて、その値をスタックにプッシュします。
※ このとき該当部分文字列は削除(置換)されません。

例えば、小文字の "a" は文字コード「97」(10進数)ですので、以下のように動作します。
    • 97@p@abcabc@0/6/\I@.0@0/2/\P@ → abcabc2

\k該当部分文字列を数値とみなして1文字ずつ漢数字に変換


該当部分文字列を数値(ゼロ以上の整数)と見なし、1文字ずつ漢数字に変換します。
    • 1230@0/-1/\k@ → 一二三〇

文字列先頭のゼロはないものとして扱われます。ただし、ゼロは「〇」に変換されます。
    • 0123@0/-1/\k@ → 一二三〇
    • 0@0/-1/\k@ → 〇

負の整数および実数だった場合、エラーと見なされ変換はおこなわれません。


\K該当部分文字列を数値とみなして漢数字表現に変換


該当部分文字列を数値(ゼロ以上の整数)と見なし、漢数字を用いた日本語表現に変換します。
    • 1230@0/-1/\k@ → 千二百三十

文字列先頭のゼロはないものとして扱われます。ただし、ゼロのみの場合は「〇」に変換されます。
    • 0123@0/-1/\k@ → 百二十三
    • 0@0/-1/\k@ → 〇

部分文字列が負の整数および実数だった場合、エラーと見なされ変換はおこなわれません。


\l該当部分文字列を改行記号 "\n" で分割しスタック最上段の数値が示す位置にある文字列で置換


該当部分文字列を改行記号 "\n" で区切り、スタック最上段にある数値(小数の場合は切り捨てて整数化)の番目にある文字列で該当部分文字列全体を置換します。この後、スタック最上段は削除されます。
※ コンマで区切られた部分文字列の先頭をゼロ番目と数えます。
    • 1@p@ab\nc\ndef@0/-1/\l@ → c
    • 2@p@ab\nc\ndef@0/-1/\l@ → def
    • 0@p@ab\nc\ndef@0/-1/\l@ → ab

スタック最上段にある数値が負の数だった場合、該当部分文字列全体が削除されます。
    • -1@p@ab\nc\ndef@0/-1/\l@ → (表示なし)

\L:該当部分文字列の長さをスタックにプッシュ


該当部分文字列の文字列長をスタックにプッシュします。このとき部分文字列は削除(置換)されません。
    • abcdefg@0/-1/\L@.0@0/2/\P@ → abcdefg7

\m:該当部分文字列をコンマで分割しスタック最上段の数値の示す位置にある文字列で置換


該当部分文字列をコンマ "," で区切り、スタック最上段にある数値(小数の場合は切り捨てて整数化)の番目にある文字列で該当部分文字列全体を置換します。この後、スタック最上段は削除されます。
※ コンマで区切られた部分文字列の先頭をゼロ番目と数えます。
    • 1@p@ab,c,def@0/-1/\m@ → c
    • 2@p@ab,c,def@0/-1/\m@ → def
    • 0@p@ab,c,def@0/-1/\m@ → ab

スタック最上段にある数値が負の数だった場合、該当部分文字列全体が削除されます。
    • -1@p@ab,c,def@0/-1/\m@ → (表示なし)

\M:該当部分文字列をコンマで分割し、ゼロ番目のものと同じ文字列の位置を数値にして置換


該当部分文字列をコンマ "," で区切り、その先頭の文字列と同じ文字列を探索し、見つかった位置を数値として該当部分文字全体と置換します。
※ コンマで区切られた部分文字列の先頭をゼロ番目と数えます。
    • c,ab,c,def,gh@0/-1/\M@ → 2
    • ab,ab,c,def,gh@0/-1/\M@ → 1

その先頭の文字列と同じものが以降に見つからない場合、ゼロ(0)に置換されます。
    • ij,ab,c,def,gh@0/-1/\M@ → 0

その先頭の文字列と同じものが以降に複数ある場合には、先頭に近い位置の数値に置換されます。


\o:該当部分文字列を数値とみなして数字混じりの英語序数表現に変換


該当部分文字列を数値(正の整数)と見なし、それを数字混じりの英語序数表現に変換して置換します。
    • 0@0/-1/\o@ → 0th
    • 1@0/-1/\o@ → 1st
    • 2@0/-1/\o@ → 2nd
    • 3@0/-1/\o@ → 3rd
    • 4@0/-1/\o@ → 4th
    • 5@0/-1/\o@ → 5th
    • 11@0/-1/\o@ → 11th
    • 20@0/-1/\o@ → 20th
    • 21@0/-1/\o@ → 21st

該当部分文字列が負の整数および実数だった場合、エラーと見なされ変換はおこなわれません。


\O:該当部分文字列を数値とみなして数字を含まない英語序数表現に変換


該当部分文字列を数値(正の整数)と見なし、それを数字を含まない英語序数表現に変換して置換します。
    • 0@0/-1/\O@ → zeroth
    • 1@0/-1/\O@ → first
    • 2@0/-1/\O@ → second
    • 3@0/-1/\O@ → third
    • 4@0/-1/\O@ → fourth
    • 5@0/-1/\O@ → fifth
    • 11@0/-1/\O@ → eleventh
    • 20@0/-1/\O@ → twentieth
    • 21@0/-1/\O@ → twenty-first

該当部分文字列が負の整数および実数だった場合、エラーと見なされ変換はおこなわれません。


\r:該当部分文字列を反転して置換


該当部分文字列を反転し、それと置換します。
    • 1230@1/2/\r@ → 1320
    • 1230@1/-1/\r@ → 3210
    • 1230@0/-1/\r@ → 0321

\R:該当部分文字列をスタック最上段の数値回だけ反復したものに置換


該当部分文字列を、スタック最上段にある数値(小数の場合は切り捨てて整数化)の回数分だけ反復した文字列に置換します。
    • 3@p@abcde@1/1/\R@ → abcddde
    • 3@p@abcde@1/2/\R@  → abcdcdcde

スタック最上段にある数値がゼロまたは負の数だった場合、該当部分文字列が削除されたものが表示されます。
    • -3@p@abcde@1/2/\R@  → abe

\s:該当部分文字列から文字列を探索してその位置をプッシュ


該当部分文字列をコンマで区切り、左から順に1番目、2番目、、、として、その1番目文字列中から2番目文字列を探索し、最も左で見つかった部分文字列の位置情報をスタックにプッシュし、1番目文字列以外を削除します。

プッシュする位置情報と、その順序は
  1. 見つかった部分文字列の長さ
  2. 見つかった部分文字列の右端文字が、1番目文字列右端からゼロ始まりで数えて何文字目か
となっています。
    • 1234512345,23@0/-1/\s@ dump@0/4/\x@
       → 1234512345 2.0,7.0

このスタックに積まれた位置情報は「@\P/\P/...@」で取り出すことで、見つかった部分文字列に対する操作を簡単におこなうことができます。
    • abcdeabcde,bc@0/-1/\s@@\P/\P/\A@ → aBCdeabcde

0番目の文字列中に1番目の文字列が見つからなかった場合には、"0"が2つプッシュされます。
    • 1234512345,ab@0/-1/\s@ dump@0/4/\x@
       → 1234512345 0.0,0.0

また、該当部分文字列にコンマがなく、全体として1番目文字列しかなかった場合にも、"0"が2つプッシュされます。
    • 1234512345@0/-1/\s@ dump@0/4/\x@
       → 1234512345 0.0,0.0

逆に、3番目以降の文字列があった場合には、それらはただ削除されます。

    • 1234512345,23,45@0/-1/\s@ dump@0/4/\x@
       → 1234512345 2.0,7.0

\S:該当部分文字列から文字列を探索して置換


該当部分文字列をコンマで区切り、左から順に1番目、2番目、3番目、、、として、その1番目文字列中から2番目文字列を探索し、最も左で見つかった部分文字列のを3番目文字列で置換し、(置換された)1番目文字列以外を削除します。
    • 1234512345,23,XY@0/-1/\S@ → 1XY4512345

3番目文字列が空文字列だった、もしくは3番目文字列がなかった場合には、1番目文字列から最も左で見つかった2番目文字列が削除されます。
    • 1234512345,23,@0/-1/\S@ → 14512345
    • 1234512345,23@0/-1/\S@ → 14512345

2番目文字列が空文字、もしくは2番目文字列がなかった場合には、1番目文字列のみそのまま出力されます。
    • 1234512345,@0/-1/\S@ → 1234512345
    • 1234512345@0/-1/\S@ → 1234512345

\t:該当部分文字列を文字列全体の先頭へ移動


該当部分文字列を、文字列全体の先頭へ移動します。
    • abcdef@1/2/\t@ → deabcf

\T:該当部分文字列を文字列全体の末尾へ移動


該当部分文字列を、エスケープキャラクタ左側にある文字列全体の末尾へ移動します。
    • abcdef@1/2/\T@ → abcfde


「ウィジェット変数」操作をおこなう特殊置換文字


「ウィジェット変数」とは、実数もしくは文字列を格納し、その値を保持し続けることができる変数です。

ウィジェット変数は、以下の特徴をもっています。
  • 同一ウィジェット内の全レイヤーおよび全レイヤー設定項目で、同じ値を返す
  • 格納された値は、そのウィジェットがホーム画面に設置され続けている限り、同じ値を保持し続ける
  • 同じウィジェット変数名であっても、ウィジェットが異なれば異なる変数として扱われる
 このウィジェット変数は、以下の特殊置換文字で操作することができます。


\q:該当部分文字列を変数名とするウィジェット変数からスタックへプッシュ


該当部分文字列を変数名とするウィジェット変数から値をスタックにプッシュし、部分文字列を削除します。
該当部分文字列の変数名を持つウィジェット変数が存在しない場合、その名前のウィジェット変数を新規作成してゼロで初期化し、ゼロをスタックにプッシュします。

該当部分文字列を変数名とするウィジェット変数に格納されている値が文字列だった場合、
  • それが数値として解釈可能であれば、その数値がスタックにプッシュされます
  • それが数値として解釈不可能であれば、ゼロがスタックにプッシュされます。
    • 12.345:wcv1@w@wcv1@q@dump@x@ → 12.345
    • qwerty:wcv1@w@wcv1@q@dump@x@ → 0.0

\Q:スタックからポップした値を該当部分文字列を変数名とするウィジェット変数へ代入


スタック最上段からポップした値を、該当部分文字列を変数名とするウィジェット変数に代入し、その後に該当部分文字列を削除します。
該当部分文字列の変数名を持つウィジェット変数が存在しない場合、その名前のウィジェット変数を新規作成して、スタックからポップした値を代入します。

    • 12.345@p@wcv1@Q@ → (ウィジェット変数wcv1には"12.345"が代入される)


\w:ウィジェット変数に文字列を代入


該当部分文字列中の一番右にあるコロン「:」で区切り、そのコロンより右側をウィジェット変数名として、それにコロンより左側の文字列を代入し、該当部分文字列全体を削除します。

該当部分文字列中にコロンがなかった場合には、該当部分文字列全体を削除するだけです。該当部分文字列中のコロンより右側に文字列がなかった場合には、該当部分文字列全体を削除するだけです。
    • qwerty@w@ → (表示なし) 
    • qwerty:@w@ → (表示なし)

該当部分文字列中のコロンより左側に文字列がなかった場合には、ウィジェット変数に空文字列を代入して、該当部分文字列全体を削除します。
    • :wcv1@w@wcv1@W@123@0/3/\t@456@0/3/\T@ → 123456


\W:ウィジェット変数に格納されている値を文字列として出力


該当部分文字列を変数名とするウィジェット変数に格納されている値を文字列として、該当部分文字列全体を置換します。

注意が必要な点として、@Q@」を用いてスタックからポップした数値を代入した場合には小数点以下が出力される、というものがあります。
例えば、以下のように"123"を「@w@」を用いて文字列として代入し、「@W@」で出力した場合には、代入時の値が文字列としてそのままの形で出力されます。
    • 123:wcv1@w@wcv1@W@ → 123

それに対して、"123"を「@q@」を用いてスタックにプッシュし、それを「@Q@」を用いてウィジェット変数に代入した場合には、「@W@」での出力結果が小数点以下を含む形で出力されます。
    • 123@p@wcv1@Q@wcv1@W@ → 123.0


外部アプリとのデータ送受信をおこなう特殊置換文字


『Glaeja』には他アプリとデータのやり取りをして連携動作する機能が2つあります。

その1つは、LocaleTasker等のプラグインとして動作することで、同アプリとの間で "Variable" と呼ばれる変数を送受信するものです。

もう1つは、『エクステンション』という『Glaeja』専用の機能拡張アプリとの間で文字列のやり取りをおこなうものです。


\V:受信した"Variable"から該当部分文字列を名前とするものを取得


これは、『Glaeja』をLocaleの“Setting plug-in”として、またはTaskerの“Action plug-in”として利用する際に用いるエスケープキャラクタです。

LocaleTaskerから送信された "Variable" から、該当部分文字列をその変数名とするものを文字列として取得し、それで該当部分文字列を置換します。


例えば、上図のようにTasker側でアクションを設定した場合、送信される「TIMEMISSCALL」という名前の "Variable" を表示するには、以下のようにします。
    • TIMEMISSCALL@0/12/\V@ → 02.34

該当部分文字列と一致する名前の "Variable" が受信されていない場合、該当部分文字列の削除をおこないます。


\Z:エクステンションに文字列を渡して結果を受け取る


これは、エクステンションに文字列を渡して(何らかの処理を施された)結果の文字列を受け取る、という際に用います。

該当部分文字列中の一番右にあるコロン「:」で区切り、そのコロンより右側の文字列と一致する「GEXコード」を持つエクステンションに、コロンより左側の文字列(パラメータ文字列)を渡し、エクステンションから返された文字列で該当部分文字列全体を置換します。

例えば、“Missed Call (Glaeja Ext.)”というエクステンションは、パラメータ文字列として「C」が渡された場合にその文字数に応じた桁数で表現された不在着信数を『Glaeja』に返す、というものです。

このエクステンションは(デフォルトでは)「GEX_MISSCALL」というGEXコードを持っているので、端末の現在の不在着信数が3件であった場合、
    • CCC:GEX_MISSCALL@0/16/\Z@ → 003

と展開・置換されます。

どのようなパラメータ文字列をどのように処理して返すか、はエクステンションによって異なりますので、詳細はエクステンションの設定画面等で確認してください。


スタック操作および演算をおこなう特殊置換文字


特殊置換文字には、プッシュ・ポップといった「スタック操作」や、加減乗除等の「スタック演算」のためのものが実装されています。

※ 『Glaeja』の持つ「スタック」については、コチラを参照してください。

『Glaeja』におけるスタックは、レイヤー設定項目ごとに独立で、設定項目に記述された文字列を解釈するたびに内容がリセットされます。このことは、同一レイヤー内の異なる設定項目間や、異なるレイヤー間で共通の値をやりとりできないことを意味します。

以下に、スタック操作および演算をおこなう特殊置換文字を記します。


\p:該当部分文字列をスタックにプッシュ


該当部分文字列を実数と見なし、それをスタックにプッシュした後、該当位分文字列を削除します。
    • 12345@1/2/\p@ → 125 (スタックには"34"が積まれる)

該当部分文字列を実数として解釈できない場合、エラーと見なされ操作はおこなわれません。


\P:スタックからポップした数値で該当部分文字列を置換


スタック最上段の実数をポップし、それを該当部分文字列を書式と見なしてフォーマットした後、その該当部分文字列と置換します。
該当部分文字列の書式は「a.b」の形式で、数値文字列全体の長さを「a」、小数点以下の桁数を「b」で記述します。
※ 「a」には「小数点そのものも含めた全文字数」を指定します。

a」で指定された桁数が、実際の桁数より多い場合には、文字列の左に" "(半角スペース)が詰められます。

例えば、スタック最上段に"1.2345"が積まれている場合、以下のように表示されます(二重引用符「"」は説明のためのもので、実際には表示されません)。
    • 10.4@0/-1/\P@ → "    1.2345" 小数点含めて全10文字

a」で指定された桁数が、実際の桁数より少ない場合には、全てを表示するのに必要な長さに自動調整されます
    • 12.345@p@5.3@0/-1/\P@ → "12.345"

b」で指定された桁数が、実際の小数点以下の桁数より多い場合には、文字列の右に"0"(半角ゼロ)が詰められます。
    • 1.2345@p@10.5@0/-1/\P@ → "   1.23450"

b」で指定された桁数が、実際の小数点以下の桁数より少ない場合、小数部分が切り捨てられて表示されます。
    • 1.2345@p@10.3@0/-1/\P@ → "     1.234"
    • 1.2345@p@10.2@0/-1/\P@ → "      1.23"

a」を、「05」のように先頭にゼロを付けて記述すると、文字列の左に余る部分は"0"(半角ゼロ)が詰められます。
    • 1.2345@p@010.5@0/-1/\P@ → "0001.23450"

a」を省略した場合、実数部分が適切に収まるよう文字列全長が自動調整されます(文字列の左に半角スペースが詰められない)。
    • 1.2345@p@.5@0/-1/\P@ → "1.23450"

b」を省略した場合、小数点以下の桁数が適切に収まるよう自動調整されます。このとき、ポップされた数値が整数だった場合には、小数点も表示されません。
    • 1.2345@p@10.@0/-1/\P@ → "    1.2345" 
    • 123@p@10.@0/-1/\P@ → "       123"

a」「b」の両方を省略することも可能です。
    • 1.2345@p@.@0/-1/\P@ → "1.2345"
    • 123@p@.@0/-1/\P@ → "123"

b」の省略による小数点以下桁数の自動調整では、「1÷3=0.333...」のように小数点以下が無限長である場合には、有効数字が14桁となるように桁数が選ばれます。


\x:スタックの演算


スタック最上段からのいくつかの段について、該当部分文字列を演算子と見なして演算をおこない、該当部分文字列を削除します。

※ 演算結果はスタック最上段にプッシュされます。該当部分文字列と置換されるのではないことに注意。


次章では、スタック演算子と見なすことのできる該当部分文字列の一覧と、その解説を記します。


スタック演算子と見なせる該当部分文字列

スタック演算は、おこなわれる演算の種類によって以下のように分類することができます。

無項算術演算子


この演算子は、何らかの関数処理結果をスタックにプッシュするものである。

calorg:元の基準日時をプッシュ


カレンダー系エスケープキャラクタの展開基準となる「基準日時」を、「$yyyyMMddHHmm$」形式の数値としてスタックにプッシュする。
このプッシュされる「基準日時」は「calset@x@」でズラされた後の「基準日時」ではなく、このウィジェットの描画更新が開始された瞬間に定められる大元の「基準日時」である。
    • calorg@x@.0@P@ → 201401200123

単項算術演算子


この演算子は、スタック最上段からポップした値に対して何らかの関数処理をおこない、その結果をスタックにプッシュするものである。

++:1加算

--:1減算


スタック最上段からポップした値に1を加算(++)もしくは減算(--)し、その結果をプッシュします。
    • 2@p@++@x@.0@P@ → 3
    • 3@p@--@x@.0@P@ → 2

sqrt:平方根


スタック最上段からポップした値の平方根を計算し、その結果をプッシュします。
    • 2@p@sqrt@x@.5@P@ → 1.41421

abs:絶対値


スタック最上段からポップした値の絶対値をプッシュします。
    • -1.23@p@abs@x@.5@P@ → 1.23000

sign:符号


スタック最上段からポップした値の符号が、負なら「-1」、ゼロなら「0」、正なら「1」をプッシュします。
    • -3@p@sign@x@.1@P@ → -1.0
    • 0@p@sign@x@.1@P@ → 0.0
    • 3@p@sign@x@.1@P@ → 1.0

ceil:切り上げによる整数化

floor:切り下げによる整数化

round:四捨五入による整数化


スタック最上段からポップした値に対し、切り上げ、切り下げ、四捨五入により整数化した値をプッシュします。
    • -1.2@p@ceil@x@.1@P@ → -1.0
    • 1.2@p@ceil@x@.1@P@ → 2.0
    • -1.2@p@floor@x@.1@P@ → -2.0
    • 1.2@p@floor@x@.1@P@ → 1.0
    • -1.51@p@round@x@.2@P@ → -2.00
    • -1.50@p@round@x@.2@P@ → -1.00
    • 1.49@p@round@x@.2@P@ → 1.00
    • 1.50@p@round@x@.2@P@ → 2.00

sin:正弦

cos:余弦

tan:正接


スタック最上段からポップした値を度と見なし、それに対する三角関数の結果をプッシュします。


asin:逆正弦

acos:逆余弦

atan:逆正接


スタック最上段からポップした値の逆三角関数の結果を、単位を度としてプッシュします。


exp:自然対数の底(e)のべき乗

log:自然対数

log10:常用対数


スタック最上段からポップした値の、自然対数の底(e)のべき乗、自然対数、常用対数(10を底とする対数)をプッシュします。



calset:基準日時を設定する


スタック最上段をポップした値を「$yyyyMMddHHmm$」で表現された日時と見なして、その日時をカレンダー系エスケープキャラクタの展開基準となる「基準日時」とします。
これにより変更された「基準日時」は、この演算子より後にある全ての「$...$」に適用されます。

例えば、大元の基準日時が「2014/01/20(月) 01:23」であった場合、
    • $EEEE$ 201401210000@0/12/\p@calset@0/6/\x@$EEEE$ → 月曜日 火曜日
と展開されます。

ajd:ユリウス通日

mjd:修正ユリウス通日


スタック最上段をポップした値を「$yyyyMMddHHmm$」で表現された日時と見なして、その日時のユリウス通日修正ユリウス通日をプッシュします。

スタックに積まれている「$yyyyMMddHHmm$」形式の日時は、システムの[日付と時刻]で選択されたタイムゾーンにおける日時として扱われることに注意してください。つまり、[タイムゾーンの選択]が「GMT+09:00, 日本標準時」となっている場合には、
    • 197001010000@p@ajd@x@.@P@ → 2440587.125
    • 197001010900@p@ajd@x@.@P@ → 2440587.5
となります。

rand:乱数


0から「(スタック最上段からポップした値)-1」までの整数の乱数を1つ生成し、それをプッシュします。
    • 5@p@rand@x@.0@P@ → 3 ([0, 1, 2, 3, 4]のいずれか1つが乱数として生成されます)

ただし、ポップされた値が「2」未満の場合(負も含む)には、0以上1未満の実数の乱数が生成されます。
    • 1@p@rand@x@.5@P@ → 0.11965

この乱数は、「rand」が評価されるたびに異なる乱数が生成されます。
    • 5@p@rand@x@5@p@rand@x@.0@P@ .0@0/2/\P@ → 3 2

wcrand:ウィジェット共通乱数


『Glaeja』では、同一ウィジェット内で共通で使える0以上1未満の実数の乱数値」が、ウィジェットの描画更新ごとに1つ生成されています(「ウィジェット共通乱数」)。

wcrand」は、スタック最上段からポップした値に、このウィジェット共通乱数を乗算した結果をプッシュします。

つまり、同一ウィジェット内で同じ値となる、0から「(スタック最上段からポップした値)-1」までの整数の乱数を取得する、ということです。
    • 5@p@wcrand@x@5@p@wcrand@x@.0@P@ .0@0/2/\P@ → 3 3


二項算術演算子


この演算子は、スタックから最初にポップされる値を val2、次にポップされる値を val1 とし、それら2つの値を用いた計算結果をプッシュするものです。

+:加算

-:減算

*:乗算

/:除算


スタックから最初にポップした値を val2、次にポップした値を val1 とし、それらの間で四則計算をおこなった結果をプッシュします。

おこなわれる四則計算は以下の通りとなります。
  • + :(val1 + val2
  • - :(val1 - val2
  • * :(val1 * val2
  • / :(val1 / val2
除算で val2 がゼロの場合は、Infinity(もしくは-Infinity)」がスタックにプッシュされます。


mod:剰余


スタックから最初にポップした値を val2、次にポップした値を val1 とし、
val1 / val2)の余りをプッシュします。

max:最大

min:最小


スタックから最初にポップした値を val2、次にポップした値を val1 とし、それらのうちの大きなほう・小さなほうをプッシュします。


caladd:カレンダー計算


スタックから最初にポップした値を val2、次にポップした値を val1 とし、それらを「$yyyyMMddHHmm$」で表現された日時と見なして、カレンダーの加減算をおこないます。
    • 201112101830@p@000000020123@p@caladd@x@.0@P@ → 201112121953
      ※ 2011年12月10日18時30分に、2日1時間23分を加えると、2011年12月12日19時53分

    • 201203010001@p@-2@p@caladd@x@.0@P@ → 201202290001
      2012年3月1日0時1分から、2分を減じると、2012年2月29日23時59分(うるう年)

    • 201202282359@p@2@p@caladd@x@.0@P@ → 201203010001
      2012年2月28日23時59分に、2分を加えると、2012年3月1日0時1分(うるう年)

二項比較演算子


この演算子は、スタックから最初にポップされる値を val2、次にポップされる値を val1 とし、それら2つの値を比較した結果をプッシュするものです。


<:小なり

<=:小なりイコール


val1 < val2」や「val1 <= val2」であれば「1」を、そうでなければ「0」をプッシュします。


>:大なり

>=:大なりイコール


val1 > val2」や「val1 >= val2」であれば「1」を、そうでなければ「0」をプッシュします。


==:イコール


val1 」と「val2」が等しければ「1」を、そうでなければ「0」をプッシュします。


<>:ノットイコール


val1 」と「val2」が等しくなければ「1」を、そうでなければ「0」をプッシュします。


三項比較演算子

tern:条件分岐


この演算子「tern」は、スタックから最初にポップされる値を val3、次にポップされる値を val2 、さらにポップされる値を val1 とした場合、
val3」がゼロであれば「val2」を、そうでなければ「val1」をプッシュします。
    • 12@p@34@p@0@p@tern@x@.0@P@ → 34
    • 12@p@34@p@56@p@tern@x@.0@P@ → 12

単項論理演算子

not:否定


スタック最上段からポップした値がゼロならば「1」を、ゼロ以外なら「0」をプッシュします。


二項論理演算子

and:論理積


スタックから最初にポップした値を val2、次にポップした値を val1 とし、
その両方ともゼロでなければ「1」を、どちらか1つでもゼロなら「0」をプッシュします。


or:論理和


スタックから最初にポップした値を val2、次にポップした値を val1 とし、
そのどちらか1つでもゼロでなければ「1」を、両方ともゼロなら「0」をプッシュします。


nand:否定論理積


スタックから最初にポップした値を val2、次にポップした値を val1 とし、
その両方ともゼロでなければ「0」を、そうでなければ「1」をプッシュします。
要するに「and@x@not@x@」と同じ動作となります。


nor:否定論理和


スタックから最初にポップした値を val2、次にポップした値を val1 とし、
その両方ともゼロであれば「1」を、そうでなければ「0」をプッシュします。
要するに「or@x@not@x@」と同じ動作となります。 


xor:排他的論理和


スタックから最初にポップした値を val2、次にポップした値を val1 とし、
そのどちらか1つだけがゼロでなければ「1」を、両方ともゼロや両方ともゼロでないなら「0」をプッシュします。


スタック操作演算子


スタックの段そのものを操作する演算子として以下のものがあります。


clear:クリア


現在のスタックを空にします。


depth:段数


現在のスタックの段数をスタックにプッシュします。


dump:ダンプ


現在のスタックの持つ全ての段を、一番底の段を先頭にコンマ区切りで整形された文字列として出力します。
    • 0@p@7@p@7@p@depth@x@dump@x@ → 0.0,7.0,2.0,3.0

dup:複製


現在のスタックの最上段の値を複製し、それをプッシュします。
    • 1@p@2@p@dup@x@dump@x@ → 1.0,2.0,2.0

drop:破棄


現在のスタックの最上段を廃棄します。
    • 1@p@2@p@drop@x@dump@x@ → 1.0

roll:抽出


現在のスタックから値をポップし、それが i なら、残ったスタックの最上段をゼロとする i 番目の値をスタック最上段へ移動します。
    • 1@p@2@p@3@p@4@p@5@p@2@p@roll@x@dump@x@ → 1.0,2.0,4.0,5.0,3.0

rot:回転


スタック最下段の値を取り出し、プッシュします。
    • 1@p@2@p@3@p@4@p@5@p@rot@x@dump@x@ → 2.0,3.0,4.0,5.0,1.0

-rot:逆回転


スタック最上段から値をポップし、スタック最下段へ挿入します。
    • 1@p@2@p@3@p@4@p@5@p@-rot@x@dump@x@ → 5.0,1.0,2.0,3.0,4.0


Appendix

特殊置換文字の一覧表


スタック演算子の一覧表


@...@」を使用した作例


1. 画像を使った時計の作例

システム情報からファイル名を「@...@」で指定して、というとバッテリー残量ウィジェットが思いつくんですが、ぶっちゃけもう作り飽きました。なので趣向を変えて、フォントの代わりに画像を使った時計ウィジェットを作ってみます。

(1) 以下のような数字の画像ファイル(と背景画像ファイル)を作成し、imagesフォルダに入れておきます。
















(2) 4×1サイズのウィジェットを配置して、デフォルトのテキストレイヤーを削除し、イメージレイヤーを新規に作成します。
そのイメージレイヤーで背景画像(NeonClock_bg.png)を表示させます。

(3) イメージレイヤーを新規追加し、時刻を画像ファイルで表示させます。
ファイル名のマッチ ]を[完全一致時のみ表示 ]とし、
パターン文字列 ]を[NeonClock_number_$HH$@0/1/\d@]とします。
このパターン文字列により、現在時の2桁目を持つファイルがマッチすることになります。

(4) もう1つイメージレイヤーを新規追加し、
ファイル名のマッチ ]を[完全一致時のみ表示 ]、
パターン文字列 ]を[NeonClock_number_$HH$@1/1/\d@]とします。
これにより、こちらでは現在時の1桁目を持つファイルがマッチすることになります。
画像が重ならないよう水平アンカーポイントを調整します。

(5) さらに1つイメージレイヤーを新規追加し、
ファイル名のマッチ ]を[完全一致時のみ表示 ]、
パターン文字列 ]を[NeonClock_number_$mm$@0/1/\d@]とします。
このパターン文字列により、現在分の2桁目を持つファイルがマッチすることになります。
これも画像が重ならないよう水平アンカーポイントを調整します。

(6) 最後にもう1つイメージレイヤーを新規追加し、
ファイル名のマッチ ]を[完全一致時のみ表示 ]、
パターン文字列 ]を[NeonClock_number_$mm$@1/1/\d@]として、
現在分の1桁目を持つファイルにマッチさせます。
最後に全てのレイヤーで水平アンカーポイントを調整したら完成です。

このスキンのZIPパッケージはココからダウンロードできます。


2. カレンダーを漢数字で縦書きにする作例 その1

和風な壁紙には、やはりカレンダーも漢字表記にしてみたいものですよね。そして、漢字だったらやはり縦書きで表示してみたいもの。というわけで、月日を漢字で縦書きにしてみましょう。

(1) 月日を漢数字で表記した場合の最大文字数は「〇〇月〇十〇日」で7文字ですので、
テキストレイヤーを7枚置き、各々の垂直アンカーポイントを重ならないようにズラしておきます。
このとき[揃え方 ]は中央揃えにしておくと仕上がりがキレイでしょう。[ロケール ]は英語のままで構いません。

(2) 上から3番目に表示されるテキストレイヤーには「月」、一番下のテキストレイヤーには「日」を表示させます。

(3) さて一番上に表示されるテキストレイヤーには「〇〇月」の2桁目が表示されますので、
表示文字列 ]を 「$MM$@0/-1/\K@@0/1/\d@」とします。
これは「月を2桁で表示し、それを漢数字で日本語表現に変換し、末尾から1文字を削除」という動作になります。
これで、「十一, 十二」では「十」が残って表示され、「一, 二, ..., 八, 九」だと何も表示されません。

(4) 2番目に表示されるテキストレイヤーには「〇〇月」の1桁目を表示したいので、
表示文字列 ]を 「$MM$@0/-1/\K@@1/1/\d@」とします。
これは「月を2桁で表示し、それを漢数字で日本語表現に変換し、末尾から1文字目から始まる1文字分を削除」という動作になります。
これで、「十一, 十二」では「一, 二」が残って表示され、「一, 二, ..., 八, 九」のように1文字だけの場合には『開始文字位置に与えられた正の整数が文字列長以上の場合 』に抵触するためエラーとなり、元の文字列がそのまま表示されます。

(5) 4, 5, 6番目に表示されるテキストレイヤーには「〇〇〇日」の1, 2, 3桁目をそれぞれ表示したいので、それぞれの[表示文字列 ]を、
・4番目:「$MM$@0/-1/\K@@2/1/\D@「日を2桁で表示し、それを日本語表現に変換し、末尾から2文字目から始まる1文字分以外を削除」
・5番目:「$MM$@0/-1/\K@@1/1/\D@「日を2桁で表示し、それを日本語表現に変換し、末尾から1文字目から始まる1文字分以外を削除」
・6番目:「$MM$@0/-1/\K@@0/1/\D@「日を2桁で表示し、それを日本語表現に変換し、末尾から0文字目から始まる1文字分以外を削除」
と設定します。こうすることで、それぞれに表示されるべき文字以外が削除されます。

このスキンのZIPパッケージはココからダウンロードできます。


3. カレンダーを漢数字で縦書きにする作例 その2

先ほど作った漢数字縦書き表示では、「十一月  一日」のように数字が短い場合に隙間が開いてしまい、いまいちカッコよくありません。そこで隙間の出ない表記にしてみましょう。

(1) 月日を漢数字で表記した場合の最大文字数は「〇〇月〇十〇日」で7文字ですので、やはりテキストレイヤーは7枚置きます。各々のレイヤーの設定は 5.2. のものと同じで構いません。

(2) 一番上のテキストレイヤーには、「一月二日」「十二月三日」「十二月三十日」「十二月三十一日」と、どのような文字数であっても、その先頭の文字を表示できればイイわけです。
ところが、Glaejaの「@...@」では、文字の位置は文字列末尾から指定となるため、「先頭文字」とか「先頭から~文字」という指定はできません。
そこで、「@0/-1/\r@」で文字列を反転させることで、「先頭から~文字」を「末尾から~文字」に変えてやることにします。
$MM$@0/2/\K@月$dd$@0/2/\K@日」を反転した「日一十三月二十」の末尾の文字以外を削除して、末尾(元文字列の先頭文字)を、一番上のテキストレイヤーに表示させます。
表示文字列 ]には「$MM$@0/2/\K@月$dd$@0/2/\K@日@0/-1/\r@@0/1/\D@」と記述します。

(3) 2番目以降のテキストレイヤーは、その[表示文字列 ]に「$MM$@0/2/\K@月$dd$@0/2/\K@日@0/-1/\r@@1/1/\D@」の赤字下線部の数値を[ 1, 2, ..., 5, 6 ]と変更して記述していきます。
こうすることで、上に位置するレイヤーから順に、元の文字列の先頭から詰め込まれるように表示されていくことになるわけです。
下の方のレイヤーにおいて文字数が短い場合には、該当する部分文字列が存在しないことになるため、全文字列が削除され、結果として何も表示されないことになります。

このスキンのZIPパッケージはココからダウンロードできます。


4. アナログ世界時計の作例

現在地である日本の現時刻と、時差のある海外での現地時刻を両方表示するアナログ世界時計を作ってみましょう。

(1) 適当なサイズのウィジェットを置き、そこへ小さなアナログ時計を置きます。アナログ時計の作り方はこちらを参照してください。
で、これは現在地の現時刻としますので、テキストレイヤーで「Tokyo」とでも表示しておきます。

(2) では海外現地時間を表示する時計を作っていきましょう。場所は、、、とりあえずロンドン(時差-9時間)にしますか。
上で作った時計を複製して、新しい時計を作成し、その表示位置を横へずらします。

(3) 時針の表示に使っている「$i$」は『午前/午後における分』を意味します。計算したい時差は-9時間なので、この「$i$」から9時間に相当する「540」分を引いた値となるよう、「$i$@p@540@p@-@x@.0@P@」と設定します。
このとき、計算結果がマイナスになっても、ハンドレイヤーの角度は正しく表示されますので問題はありません。

(4) ちょっと変わったところでは、ネパールの首都カトマンズの時差は日本に対して-3時間15分です。
なので、これを表示するには、時針を「$i$@p@180@p@-@x@.0@P@」とするだけでなく、分針も「$m$@p@15@p@-@x@.0@P@」と15分引くように設定しなければなりません。

このスキンのZIPパッケージはココからダウンロードできます。


5. バッテリー残量に応じてフォント色を変える作例

バッテリー残量を数値表示させている場合、「20%下回ったら赤文字にしたいな」と思うことがあります。フォントの色数値をエスケープキャラクタで「#P#」から生成できれば一番良いのでしょうが、色を専用ダイアログでのみ指定する現状ではそれは不可能です。では、マッチテキストを駆使して、となると、、、、、

・ 元の[表示文字列 ] を「#PPP#@0/1/\d@」(3桁でバッテリー残量を表示し下1桁を削除)したマッチテキストを10枚置き、
・ 全てのマッチテキストの元の[文字の色 ]を完全透明、[置換文字列 ]を「#P#」にしておく
・ 各々のマッチテキストで[探索文字列 ]を[00, 01, 02, ..., 08, 09]に設定し分けた上で、
・ [探索文字列 ]を[00, 01]にしたマッチテキストのみ対象の[文字の色 ]を「赤」、他を「白」にする

とでもすればできるでしょうが、いかんせんレイヤー10枚は多すぎます。

というわけで、マッチテキストとスタック操作用特殊置換文字を駆使して、この「20%下回ったら赤文字」をもっと少ないレイヤー数でやってみましょう。

(1) 適当なサイズのウィジェットを置き(ここでは1×1)、マッチテキストレイヤーを1枚追加します。
そして、元の文字列の[表示文字列 ]を「#P#@p@20@p@<@x@.0@p@」と設定します。
これは『バッテリ残量をプッシュ、「20」をプッシュ、スタック上から2段を”<”で比較し、その結果(バッテリ残量が20未満なら「1」、そうでなければ「0」)をプッシュ、最後にスタック最上段(先ほどの比較結果)を表示』という意味になります
こうすると、以下のようにバッテリ残量が20%未満なら「1」、20%以上なら「0」が表示されます。

バッテリ残量19%
バッテリ残量20%
(2) このマッチテキストレイヤーの対象の文字列の、

・ [探索文字列 ]を「1」、
・ [置換して表示する ]をチェック
・ [置換文字列 ]を「#P#
・ [文字の色 ]を「赤(#FFFF0000)

とすることで、以下のようにバッテリ残量が20%未満のときだけ、赤で残量を表示できました。
このとき、20%未満以上のときに「0」を表示させないよう、 元の文字列の[文字の色 ]を「透明(#00000000)」にしておきます。

バッテリ残量19%
バッテリ残量20%
(3) では、20%以上を白で表示させるレイヤーを作成しましょう。
上のマッチテキストレイヤーを複製して追加し、それの元の文字列の[表示文字列 ]を「#P#@p@20@p@>=@x@.0@p@」と設定します。
これは『バッテリ残量をプッシュ、「20」をプッシュ、スタック上から2段を”>=”で比較し、その結果(バッテリ残量が20以上なら「1」、そうでなければ「0」)をプッシュ、最後にスタック最上段(先ほどの比較結果)を表示』という意味になります
こうすることでこちらでは、以下のようにバッテリ残量が20%未満なら「0」、20%以上なら「1」が表示されます。
ただし、 20%未満なら先ほどのレイヤーにより赤で残量が重なって表示されます。
※ 説明のため、元の文字列の[文字の色 ]や対象の文字列の設定値を戻してあります。

バッテリ残量19%
バッテリ残量20%
(4) このマッチテキストレイヤーも同様に、

元の文字列:
・ [文字の色 ]を「透明(#00000000)

対象の文字列:
・ [探索文字列 ]を「1」、
・ [置換して表示する ]をチェック
・ [置換文字列 ]を「#P#
・ [文字の色 ]を「白(#FFFFFFFF)

としてやれば、以下のようにバッテリ残量が20%以上のときに、白で残量を表示できるようになりました。

バッテリ残量19%
バッテリ残量20%
というわけで、たった2枚のレイヤーで実現できましたね。でも、これだけでも物足りないので、『バッテリー残量が20%以上40%未満ならオレンジで、40%以上なら白で表示』に変更してみましょう。

(5) 先ほどの『20%以上なら白』レイヤーの「#P#@p@20@p@>=@x@.0@p@」を「#P#@p@40@p@>=@x@.0@p@」に書き換えて、『40%以上なら白で表示』に変更します。

(6)マッチテキストレイヤーをもう1枚複製して追加し、

元の文字列:
・ [表示文字列 ]を「#P#@p@20@p@>=@x@#P#@p@40@p@<@x@and@x@.0@p@

に書き換えます。これは、
・  「#P#@p@20@p@>=@x@」により、バッテリ残量が20%未満なら「0」、20%以上なら「1」がスタックに積まれます。
・ 次に「#P#@p@40@p@<@x@」により、バッテリ残量が40%未満なら「1」、40%以上なら「0」が先ほどのスタックのさらに上に積まれます。
・ そして「and@x@」により、最初の結果とその次の結果が、両方とも「1」(つまり20%以上40%未満)なら「1」、そうでないなら「0」がスタックに積まれます。
・ 最後に「.0@p@」によって、その結果が表示されます。

このテキストマッチレイヤーの、

対象の文字列:
・ [探索文字列 ]を「1」、
・ [置換して表示する ]をチェック
・ [置換文字列 ]を「#P#
・ [文字の色 ]を「オレンジ(#FFFF6600)

とすることで、 『バッテリー残量が20%以上40%未満ならオレンジ』が追加されました。

バッテリ残量19%
バッテリ残量20%
バッテリ残量40%
このスキンのZIPパッケージはココからダウンロードできます。



…とりあえず今んとこ思いつく作例はこれで終了。また何かできたら追加するかも…





37 件のコメント:

  1. こんにちは はじめまして
    glaejaを使い始めたばかりの上に頭が悪いのですが・・・
    天気%C%を分解して 
    1・2・3桁をマッチしてそれぞれの画像を表示させたいのですが、例えば2桁目の「のち」だけの画像を表示させたい場合@...@を使って1・3桁を消してマッチさせる方法でいいのでしょうか たぶん見当違いの事を言ってると思いますが、よろしければご教授お願いいたします。

    返信削除
  2. > 1・3桁を消してマッチさせる方法でいいのでしょうか

    そうです。

    2桁目だけ残して後を削除ですので、「%C%@1/1/\D@」でOKですかね。

    返信削除
  3. 解決しました。ありがとうございました♪
    助かりました♪

    返信削除
  4. はじめまして。
    Glaejaを利用させていただいています。
    「com.gmail.kanitawa.glaeja/images/」に入れた
    gmail_1.pngという画像を
    Gmailの受信数が1以上の場合表示させたいと思っています。
    イメージレイヤーにて「ファイル名のマッチ」を「完全一致時のみ表
    示」とし
    「パターン文字列」に
    gmail_?G?@p@0@p@>@x@.0@P@
    あるいは
    gmail_?G?@p@1@p@>=@x@.0@P@
    と入れましたが、画像が表示されません。

    こちらのページを参考にさせていただき自分なりに考えてみましたが、
    恥ずかしながら何が間違っているかすら見当がつかない状態です。
    もしよろしければ、お時間のある時にでもお教えいただけないでしょう
    か。
    よろしくお願いいたします。

    返信削除
    返信
    1. 「@p@」や「@P@」は、「@0/-1/\p@」「@0/-1/\P@」の省略形です。ですので、

      gmail_?G?@p@0@p@>@x@.0@P@

      では、「gmail_?G?@p@」の「@p@」で「gmail_1@0/-1/\p@」と解釈され、
      「"gmail_1"は数値じゃないからスタックに入れらんねぇよ」と
      エラーになり、以降一切の解釈を行いません。

      削除
  5. 数値のみになるようファイル名とパターン文字列からgmail_を削除したら、画像が表示されました!
    教えて頂きありがとうございました。
    お手数おかけしてすみませんでした。

    返信削除
  6. Glaeja勉強中2012年6月21日 20:52

    はじめまして。Glaejaを使いこなすべく勉強中です。
    素人なので用語がふさわしくない部分があるかもしれません。ご了承ください。

    読んでいて誤植と思われる箇所があったのでご報告します。
    もし誤植でないならば私の解釈が間違っているということなので、正しい解釈をご教示頂けますか。

    ・「2.特殊置換文字」での項目「\e」の記述例
    誤・123@0/-1/\E@ → one two three
    正・123@0/-1/\e@ → one two three
    次の行も同様。

    ・「2.特殊置換文字」での項目「\l」の記述例
    誤・1@p@ab\nc\ndef@0/-1/\m@ → c
    正・1@p@ab\nc\ndef@0/-1/\l@ → c
    以下3行も同様。

    ・「2.特殊置換文字」での項目「\o」および「\O」
    注釈に「 部分文字列がゼロ・負の整数および実数だっ た場合、エラーと見做され変換は行なわれません。 」とありますが、記述例にはゼロの場合も紹介されています…。

    このページ全文に目を通しほとんどは理解できたと思うのですが、いくつか疑問が残ったので質問させてください。
    ・スタックに複数の数値がポップされる際、文字列の前から順にスタック内へ下から積み上げられ、出力される際は上の段から順に読み込む、という解釈でよいのでしょうか。
    ・\bおよび\Bの役割がよくわかりません。
    エスケープキャラクタに含まれない文字列内にあればバックスペースとして働くのですよね?
    エスケープキャラクタ内では\bは「文字列に含まれるバックスラッシュエスケープ文字を対応する制御コードに変換 」、\Bは「 文字列に含まれる制御コードを画面描画用に整形 」とありますが、これらをセットで記述しないと 「0123\nABCD」といった文字列がウィジェット上で改行表示されないということでしょうか。
    もう少し例をあげていただけると理解できると思うのですが…。
    お時間のあるときにでもご回答お願い致します。

    返信削除
    返信
    1. 先ずは、誤記訂正ありがとうございました。訂正しておきます。

      > 注釈に「部分文字列がゼロ・負の整数および実数だった場合
      ここはバージョンアップでゼロ対応したときに修正しわすれていました。

      削除
    2. > ・スタックに複数の数値がポップされる際
      これは仰られる通りです。
      ここらへんに関しては、以下もご参照されるとより一層理解が深まるかと思います。

      http://bananawani-mc.blogspot.com/2012/02/glaeja-glaeja.html
      http://bananawani-mc.blogspot.jp/2012/02/glaeja-stuck-on-you.html

      > セットで記述しないと 「0123\nABCD」といった文字列が
      > ウィジェット上で改行表示されないということでしょうか。
      「マルチラインテキスト」に表示させる場合なら、
      "\n"だけは@.../.../\B@なしでも改行されて表示されます。
      ※これは「マルチラインテキスト」の特性です。

      また、言うまでもないことですが、
      「マルチラインテキスト」以外のレイヤー
      (「テキスト」「リッチテキスト」)では、
      どうやろうが改行を表示することはできません。

      > ・\bおよび\Bの役割がよくわかりません。
      これらは、上記「マルチラインテキストで\nを改行として表示する」
      以外の表示整形を行うためのものです。

      例えば、"123\b456"という文字列があったとして、
      それをそのまま「テキスト」で表示させると、
      そのまま『123□456』と画面に表示されます。
      ※"□"は制御コードが表示できないため

      "\s","\t","\b","\n","\f","\r","\\"は、@.../.../\b@によらずとも
      「テキスト」「リッチテキスト」「マルチラインテキスト」の特性により
      @.../.../\b@と同様に制御コードに変換されます。

      この制御コードを実際の文字列描画に反映させるよう、
      文字列の組み換え等をおこなうのが@.../.../\B@です。

      「テキスト」で"123\b456@0/-1/\B@"を表示させると、
      "\b"がテキストレイヤー特性で制御コード0x08になり、
      それが@.../.../\B@により"前1文字削除"と解釈されて、
      "12456"と表示されることになります。

      削除
    3. さて、「だったら@.../.../\b@いらないじゃん」と思われるかもしれませんが、
      ちょっとネガティブな存在理由があるのです。

      それは「Glaejaで表現できないバックスラッシュエスケープ文字の非表示化」です。

      例えば、"\a"というバックスラッシュエスケープ文字があります。
      これは「ベル文字」とも呼ばれているもので、
      これが含まれたテキストファイルをLinuxコンソール等で表示すると、
      この文字は表示されず、代わりにブザー音がなったり、画面がフラッシングしたりします。

      どこかからダウンロードしたテキストファイルをGlaejaで表示したりする場合
      (まぁほぼそんなシチュエーションはないと思いますがw)
      そのテキストに"123\a456"が含まれていたとすると、
      「テキスト」「リッチテキスト」「マルチラインテキスト」は
      "\a"を制御コードに変換する特性を持ちませんので、
      "123\a456"とそのまま表示されます。
      …本来は非表示なので"123\a456"と表示されるのは好ましくありません。

      そこで、@.../.../\b@で制御コード化し、さらに@.../.../\B@をかけることで
      (非対応な制御コードなので)表示されないようにするわけです。

      削除
    4. ある文字列を桁揃え等の整形を施して表示させたい場合、
      制御コードを用いて、桁揃えや改行・垂直改行をさせるわけですが、
      普通の環境でこれら制御コードを直接キー入力は出来ませんので、
      代わりにバックスラッシュエスケープ文字を使うわけです。

      Glaejaでは、この「バックスラッシュエスケープ文字を含んだ文字列」を
      まず@.../.../\b@で制御コードに変換し、
      それを@.../.../\B@で空白等で整形して表示させるわけです。

      で、使用するバックスラッシュエスケープ文字が

      "\s","\t","\b","\n","\f","\r","\\"だけなら、表示に使う
      「テキスト」「リッチテキスト」「マルチラインテキスト」の特性により
      最初の@.../.../\b@は不要で、自動的に制御コード化が行なわれます。

      また「マルチラインテキスト」なら、制御コード0x0A(\n)を認識し、
      自動的に改行が行なわれます。

      削除
    5. …まぁ、ここらへんは、実際に色んな文字列を使って実験してみないと
      実感として理解はしにくいかと思います。

      ていうか、実際問題として、これを正しく把握してないと困る、
      ってシチュエーションが思いつきませんがw

      削除
  7. Glaeja勉強中2012年6月22日 3:42

    迅速かつ詳細なご回答ありがとうございます!

    スタックについてのエントリはまだ読んでいませんでした…。
    解決しました。スタックへの入力は「プッシュ」でしたね。

    「制御コード変換」と「制御コードを整形」についても理解できました。
    バックスラッシュエスケープ文字と特殊置換文字で
    同じアルファベットが用いられるのがややこしいですね…。
    出てくるであろう疑問にもあらかじめ答えていただき感謝いたします。

    どのエントリもとてもわかりやすい解説で本当に尊敬します。
    大学の講義では実体が見えないまま計算していた「線形変換」の
    イメージがようやく掴めました。
    崩しを入れつつも言葉選びは正確で、論理の流れがすっきりしていて
    「これが言語を操る人かぁ」とただただ感嘆するばかりです。


    スキンをインポートして中身を見てみたものの
    エスケープキャラクタがさっぱり読み取れなかったので、
    このエントリをしらみつぶしに読みこんだ次第です。
    仰る通り私の使用範囲では全ての置換や演算を正しく理解せずとも事足りそうです。
    というかどこでどう使うのか想像もつかないものばかりです…。
    でも知らなかったことを理解していくという作業は楽しいです。
    謎の記号の羅列が意味をもった言語になるところがなんともわくわくします。

    しばらくはスキンや作例を参考に使い方を学んでいきます。
    丁寧なご回答ありがとうございました。

    返信削除
  8. バーをカスタマイズしてるのですが、
    少し質問があります。

    トリガーを使って、バーを出現させたり消したりをやってみようとしたのですが、
    うまくいきません。
    やってみたいのは、
    バッテリー残量が「20%以下の時」「20~40%の時」などで、
    出現させたり消したりを実行したいのですが、可能なのでしょうか?
    条件文字列のところに「#P#@p@20@p@<=@x@.0@p@」など入れても動作しないのですが・・・

    よろしくお願いします。

    返信削除
    返信
    1. > 「#P#@p@20@p@<=@x@.0@p@」など入れても動作しない

      そりゃ最後の「@p@」が小文字じゃ動作しませんよ。

      いきなり「トリガー」に書くのではなく、最初は「テキスト」に書いて、
      動作を確認しながらやってみることをおすすめします。

      削除
  9. はじめまして。最近glaejaを使いはじめ、勉強中です。デジタルで世界時計を作りたいのですが、表示文字列はどのようにすればよいのでしょうか。ご指導願います。

    返信削除
    返信
    1. 世界時計ですから、現在時刻から時差があるわけですよね。
      このエントリにあります「caladd@x@」というものを使うと、
      ある時刻に時間を足したり引いたりが可能ですので、
      これをご使用になればよろしいかと思います。

      削除
  10. 返信ありがとう御座います。すいません、時間だけを表示したい場合はどうすればよいでしょうか?よろしくお願いします。

    返信削除
    返信
    1. 「caladd@x@」は入出力ともに「$yyyyMMddHHmm$」という形式
      (例えば、2012/09/18 00時26分なら"201209180026")を用いていますので、
      時は下4桁目と3桁目、分は下2桁目と1桁目を取り出せばいいですね。
      文字の取り出しは「@.../.../D@」で指定した部分以外を削除すればいいと思います。

      削除
  11. すいません、時差9時間のロンドンの場合の表示文字列を教えていただけないでしょうか。何故か上手くいかなくて(^_^;)

    返信削除
    返信
    1. > 何故か上手くいかなくて(^_^;)

      何故上手くいかないのか?
      それがこちら側が原因のバグ等であれば対応しますが、
      そうでないのであれば、申し訳ありませんが対応いたしません。

      こちらでは「使い方」をお教えすることはあっても、
      「代わりに作ってさしあげる」ことは滅多にしておりません。


      時差9時間のロンドンの時刻を表示する文字列が知りたいだけであれば、
      2chの適切なスレにでも書けば、誰かが教えてくれることでしょう。

      で、そのあと、他の時差の時刻を表示したく鳴った場合にどうされるのですか?
      また同じように誰かに「正解」だけを教えてもらうのですか?
      それでも構わない、とおっしゃられるのであれば、
      それこそ、ここでないどこかでお聞きになられる方がよろしいかと思います。


      「時差+9時間のロンドンの時刻を表示しようとして、
       『~』という文字列を作ったんですが上手く表示されません」
      なら、某かのコメントをすることはありますが…

      削除
  12. そうですね、すいませんでした。一応、「 $yyyyMMddHHmm$@p@-0900@p@caladd@x@.0@P@@0/4/D@@2/0/:@ 」このようなものが出来ていたのですがどこにミスがあるのでしょうか。コメントお願いします。

    返信削除
    返信
    1. > @0/4/D@

      エントリをよ~~~く見てください。
      @0/4/\D@ とバックスラッシュが必要です。
      機種によってはバックスラッシュではなく半角¥記号で表示されますが。

      削除
  13. あ、ほんとですね!D@は使ったことがなかったので、お恥ずかしいミスをしてしまいました。ちょうど、バックスラッシュではなく半角¥記号の機種だったので最後のアドバイスも助かりました。長々と質問してしまい申し訳なかったです。ありがとう御座いました!

    返信削除
  14. はじめまして。

    %C%をひらがなで表示させたいのですが、一つずつテキストを作っていくと、はれ、とかみなり、のような文字数のズレで文字が重なってしまいます。
    かといって、スペースを多くとると、間があきすぎてしまいます。
    どうしたらよいでしょうか。

    返信削除
    返信
    1. すみません、何をおっしゃられているのかよくわかりません。

      多分、「一つずつテキストを作って」ではなく
      「リッチテキスト」レイヤーで1つずつ文字列に分けてやれば
      イイのではないでしょうか?

      削除
    2. その通りでした。基本から勉強し直します。
      ありがとうございました。

      削除
  15. 特殊置換文字の\Aのところの例題でg抜けてませんか?一応報告だけしときます

    返信削除
    返信
    1. ホントだ、、、直しときます。報告ありがと。

      削除
  16. 初めまして
    表形式のカレンダー(壁にかけるようなやつ)を作っているのですが、29,30,31を場合に応じて消すプログラムが動きません。

    その月の最終日+1、+2、+3をそれぞれLdp1,Ldp2,Ldp3というウィジェット変数に代入し、マルチラインテキスト上にて

    …(略)…27 28 29 30 31,,Ldp1@,W@, @0/-1/\S@,,Ldp2@,W@, @0/-1/\S@,,Ldp3@,W@, @0/-1/\S@

    と記述しました。

    例えばうるう年の2月であれば、30と31がそれぞれ半角スペース2つに置換されることを想定しています。

    改行や不要な半角スペースはありませんでした。

    カンマの使い方を誤っているのでしょうか……?

    返信削除
  17. 初めまして
    壁にかかっているような表形式のカレンダーを作っているのですが、月に応じて29日以降を消去する(半角スペース2つに置換する)プログラムを作ったところ、動きません。

    現在の月の最終日(Ld)を計算し、
    最終日+1、+2、+3をそれぞれLdp1,Ldp2,Ldp3というウィジェット変数に格納しました。(「テキスト」上)

    その後、別の「マルチラインテキスト」上にて以下のように記述しました。

    …(略)…27 28 29 30 31,,Ldp1@,W@, @0/-1/\S@,,Ldp2@,W@, @0/-1/\S@,,Ldp3@,W@, @0/-1/\S@


    日にちを羅列表示し、最終日より大きい数字を半角スペース2つで置換しようとしています。

    カンマの使い方に誤りがあるのでしょうか……?

    ご教授いただければ幸いです。

    返信削除
    返信
    1. …他人の書いた複雑な@@は意味わからんねwww

      当方の環境では、以下の@@はちゃんと機能しました。
      29:ld1@w@30:ld2@w@31:ld3@w@27 28 29 30 31,,ld1@,W@, @0/-1/\S@,,ld2@,W@, @0/-1/\S@,,ld3@,W@, @0/-1/\S@


      …ウィジェット変数「Ldp1・2・3」にはちゃんと[29, 30, 31]とかが『文字列』で入ってますか?
      数値だからといって「@w@」ではなく「@q@」で代入してませんか?

      削除
  18. 伺いたいのですが、テキストファイルから\fで日本語を読み込もうとした際、文字化けを起こしてしまうのですが、設定を間違っているのでしょうか

    返信削除
    返信
    1. そのテキストファイルはどんな環境で作成したものですか?
      Android端末では文字コードがUTF-8でないと化けますよ。

      削除
  19. はまりこんで使わせて頂いてます。
    些細な要望なのですが、文字列のスペースを、違う文字に置換か、色を変える設定は出来ないでしょうか?例えば自分で動くと思って作ってても、期待していた結果が出なくて「何でだろ?」と思っていると、スペースが入っている時があります。リッチテキストで前後にスペースを入れたい場合、特に条件を着けたとき( a , b @m@)など、スペースを数えるのに苦労してます。ネット上からコピーしたときも、スペースが入っている時があります。全くglaejaではなく、自分の技術の無さのせいなのですが、どうかご検討お願いいたします。

    返信削除
    返信
    1. > 出来ないでしょうか?

      つらつらと実装を考えてみましたが、まぁ望み薄ですね。
      欲しい機能と、それを実装する作業量と、得られる効能、が見合わないように思います。

      コピペでスペースが入ってしまうのはIME側の問題ですので、
      IMEの設定でOFFにしてください。
      ※Google日本語入力などでは設定がなくOFFにできませんが…

      削除
  20. 考えてみていただきありがとうございました。今は怪しいと思ったら、いちいちサポテキで置換してます。その手間を惜しみました。すいません。お忙しとは思いますが、わずかな実装の可能性に期待してます。

    返信削除