GoogleAnalytics

SyntaxHighlighter

2013年2月7日木曜日

[Glaeja] エスケープキャラクタ解説と一覧

「エスケープキャラクタ」は、『Glaeja』の「テキスト」レイヤー表示文字列や、「多角形」レイヤーの頂点座標[水平][垂直]等を記述するときに利用できる文字列の記述に関わる特殊文字です。

『Glaeja』のレイヤー設定項目において入力された文字列は、 通常の記述方法であればそのままの形で描画エンジンに解釈されますが、この「エスケープキャラクタ」を用いた記述の場合には、その内容が解析され別の文字列に展開されてから描画エンジンに解釈されます。

本エントリでは、その「エスケープキャラクタ」の概要を解説し、そのうちのシステム情報展開系エスケープキャラクタに関する一覧を記します。

目次


エスケープキャラクタとは

エスケープキャラクタとは、文字列に含まれる特殊記号のことです。

『Glaeja』の文字列解析エンジンは、この特殊記号が文字列中にあった場合には、その記号文字で囲まれた部分を読み取り、その記述内容に従って以下の動作をおこないます。
  1. 囲まれた部分を、システム情報等を表す別の文字列に展開・置換する
  2. 囲まれた部分より前方(左側)の文字列を置換する(@...@
  3. 文字列解析エンジン自体の挙動を変更する(|...|
このエントリでは1.に関して解説します。 2.や、3.に関しては別エントリをご覧ください。


エスケープキャラクタ展開の規則

特殊記号文字で囲まれた部分が、どのようなシステム情報に展開されるかは、
  • 特殊記号文字: システム情報の分類
  • 囲まれた部分の文字: 具体的な情報
というように判断されます。 以降では、「特殊記号文字」を「エスケープキャラクタ」、「囲まれた部分の文字」を「展開文字」とします。


要するに、システム情報ごとに異なる変換テーブルがあり、エスケープキャラクタで「どのシステム情報の変換テーブルを使うか」を決めて、展開文字で「そのテーブルにあるどの情報を表示するか」を決めるわけです。

例えば、「H」という展開文字はいくつかのシステム情報分類の変換テーブルに重複して存在しますが、カレンダー情報分類となる「$」の変換テーブルでは[時(0時始まり24時間表記)]、バッテリ情報分類となる「#」の変換テーブルでは[バッテリの健康状態]と、異なる情報に展開されます。


展開文字は文字列解析エンジンにより1文字ずつ解析・展開されていきますが、この展開には以下のような5つの規則があります。
  1. 異なる展開文字が1文字ずつ並んでいた場合には全て1つずつ展開されていく
  2. 同じ展開文字が複数並んでいる場合は、その展開文字によって結果が異なる
  3. 変換テーブルにない文字は展開されず、そのまま出力される
  4. エスケープキャラクタは「入れ子構造」になれない
  5. 単一引用符エスケープキャラクタは特殊
以下に各々の詳細を記します。

a. 異なる展開文字が1文字ずつ並んでいた場合には全て1つずつ展開されていく


例えば、バッテリ充電率を表す「#P#」が「50」と、バッテリ充放電状態を表す「#S#」が「discharging」と展開される場合なら、「#PS#」と並べて記述すると「50discharging」と並んで展開されます。

b. 同じ展開文字が複数並んでいる場合は、その展開文字によって結果が異なる


この規則には、以下の3つの場合があります。
  1. 数値に展開される場合には個数によって桁数が変化するものがある

    例えば、バッテリ充電率を表す「#P#」の場合、

    #P#」のように「P」を1つだけ記述すると、
    0, 1, 2, ..., 9, 10, 11, ..., 20, ..., 98, 99, 100」と、桁数可変で展開されます。

    #PP#」のように「P」を2つ記述すると、
    00, 01, 02, ..., 09, 10, 11, ..., 20, ..., 98, 99, 100」と、最小桁数2桁でゼロパッドされて展開されます。

    #PPP#」のように「P」を3つ記述すると、
    000, 001, 002, ..., 009, 010, 011, ..., 020, ..., 098, 099, 100」と、最小桁数3桁でゼロパッドされて展開されます。

    数値に展開される展開文字の多くが、このような桁数変化を起こします。


  2. 個数によって展開結果が変わるものがある

    例えば、現在の曜日を表す「$E$」の場合(ロケールは英語)、

    $E$」のように「E」を1つだけ記述すると、「Wed」と展開されます。

    $EE$」のように「E」を2つ、「$EEE$」のように3つ記述しても、「Wed」と展開されます。

    $EEEE$」のように「E」を4つ記述すると、「Wednesday」と展開されます。

    いくつかの展開文字で、このように個数によって展開結果が異なるものがあります。


  3. 個数によらず同じものに展開される

    例えば、バッテリへの給電種を表す「#G#」は、いくつ「G」を並べても[AC, USB]と同じ結果に展開されます。

c. 変換テーブルにない文字は展開されず、そのまま出力される


例えば、バッテリ情報分類となる「#」の変換テーブルには「m」という展開文字はありませんので、「#m#」は「m」と出力されます。

ただし、カレンダー情報分類となるエスケープキャラクタ「$」では若干事情が異なります。

$」では展開文字の解析にJavaの「java.text.SimpleDateFormat」ライブラリを用いているのですが、このライブラリで定義されていない文字が含まれていた場合には、エラーとして入力文字列全体(※エスケープキャラクタと囲まれた部分だけでないことに注意)を削除してしまいます。

d. エスケープキャラクタは「入れ子構造」になれない


文字列解析エンジンの動作として、「あるエスケープキャラクタが見つかったら、そこから右へ最も近い同じエスケープキャラクタまでを“囲まれた部分”とし、そこに含まれる文字を“あるエスケープキャラクタに対応した変換テーブル”で展開する」となっていますので、展開の途中で変換テーブルを別のものに変更するようにはなっていず、そのため「入れ子構造」にもなりえません。

例えば、現在、USBケーブルで充電中で充電率が72%だとします。

#P#」は現在のバッテリー充電率を、「#G#」は現在のバッテリー給電種を、「$G$」は紀元[BC, AD]を表すのですが、「#P$G$#」は「72$USB$」と展開されます。

つまり、「#...#」によってバッテリ情報分類系変換テーブルが優先して用いられ、中にある「$...$」でカレンダー情報分類系変換テーブルに変更されたりはしないわけです。
なので「G」はカレンダー情報分類系変換テーブルにある「$G$:紀元」ではなく、バッテリ情報分類系変換テーブルにある「#G#:バッテリー給電種」として展開され、「$」文字はバッテリ情報分類系変換テーブルにない文字なので、上記 “規則によりそのまま出力される、というわけです。

e. 単一引用符エスケープキャラクタは特殊


これは、上記 “規則” の例外規則になります。

単一引用符「 ' 」は、エスケープキャラクタとして機能する文字で、これに囲まれた文字列は「一切の解析・展開を受けずそのまま出力」される、という「無変換」系エスケープキャラクタです。

例えば、「'#P#'」は「#P#」というように、バッテリ情報分類系変換テーブルによる展開を受けずに出力されます。

そして、この「 ' 」だけは他のエスケープキャラクタで囲まれた内部で一階層の入れ子として機能できます。

例えば、「#'P is 'P#」は「P is 50」と展開されます。

ちなみに、単一引用符そのものを出力するには、「\'」と記述すれば可能です。


システム情報分類ごとの展開文字変換テーブル

以下に、システム情報分類ごとの変換テーブルと、展開文字の一覧を記します。

展開文字の変換に関わる“規則”にあるように、複数並べた場合に展開結果が異なる場合には、それらを併記しています。

$」:カレンダー情報分類


日付や時刻といったカレンダー情報に展開されるエスケープキャラクタで、その展開文字の多くは[java.text.SimpleDateFormat]で用いられているものが使用可能です。

記号意味表示例
日本語英語
a午前/午後午後PM
b基準日時を何日か前にする*1

B基準日時を何日か後にする*1

C現日時における月齢 23.323.3
d33
E短い曜日名Sat
EEEE長い曜日名土曜日Saturday
f週における経過日数
(日曜がゼロ、土曜が6)
和暦元号平成平成
G紀元西暦AD
h時(12時間表記)
※1時始まり
1212
H時(24時間表記)
※0時始まり
00
i午前/午後における経過分数9191
I1日における経過分数811811
j現日時のユリウス通日2455914.142455914.14
J現日時の修正ユリウス通日55913.6455913.64
k時(24時間表記)
※1時始まり
2424
K時(12時間表記)
※0時始まり
00
l今月の全日数3131
L今年が閏年なら“1”
そうでないなら“0”
11
m77
M月(数値)99
MMM短い月名9月Sep
MMMM長い月名9月September
n基準日時を何ヶ月か前にする*1

N基準日時を何ヶ月か後にする*1

v基準日時を何週か前にする*1

V基準日時を何週か後にする*1

x基準日時を何年か前にする*1

X基準日時を何年か後にする*1

yy西暦年(下2桁)1111
yyyy西暦年(4桁)20112011
Y和暦年数 2323
*1 基準日時についてはこのエントリを参照

上の表にない展開文字でも [java.text.SimpleDateFormat]に定義されているものは使用できます


#」:バッテリー情報分類


バッテリーの充電率や健康状態といった情報に展開されるエスケープキャラクタです。

記号意味表示例
日本語英語
G給電種AC
USB
AC
USB
H健康状態不明
良好
過熱
死亡
過電圧
未詳
unknown
good
overheat
dead
over voltage
unspecified_failure
l充電レベル5050
P充電率(%)5050
s満充電レベル100100
S充放電状態不明
充電中
放電中
充電断
満充電
unknwon
charging
discharging
not charging
full
T温度(℃)36.936.9
t電池種Li-ionLi-ion
v電圧(mV)12341234
V電圧(V)1.2341.234


&」:メモリ情報分類


RAMや内部ストレージ・SDカードの容量といった情報に展開されるエスケープキャラクタです。

オプションストレージ」は、[Glaeja設定]→[動作に関する設定]→[オプションストレージのパスで指定したボリュームに関する情報に展開されます。これを指定することで「ダウンロードキャッシュ(/cache)」や「外付けSDカード(/mnt/sdcard/external_sd)」等の容量情報を展開することが可能です。

記号意味表示例
日本語英語
eSDカード全容量
(バイト単位)
3301785633017856
ESDカード全容量
(最適な単位を含む)
31.5MB31.5MB
fSDカード空き容量
(バイト単位)
3094630430946304
FSDカード空き容量
(最適な単位を含む)
29.5MB29.5MB
SDカード使用容量
(バイト単位)
20715522071552
GSDカード使用容量
(最適な単位を含む)
2.0MB2.0MB
SDカード空き比率
(%単位)
9393
HSDカード使用比率
(%単位)
66
i内部ストレージ全容量
(バイト単位)
6710886467108864
I内部ストレージ全容量
(最適な単位を含む)
64.0MB64.0MB
j内部ストレージ空き容量
(バイト単位)
4055449640554496
J内部ストレージ空き容量
(最適な単位を含む)
38.7MB38.7MB
k内部ストレージ使用容量
(バイト単位)
2655436826554368
K内部ストレージ使用容量
(最適な単位を含む)
25.3MB25.3MB
l内部ストレージ空き比率
(%単位)
6060
L内部ストレージ使用比率
(%単位)
3939
mオプションストレージ全容量
(バイト単位)
6710886467108864
Mオプションストレージ全容量
(最適な単位を含む)
64.0MB64.0MB
nオプションストレージ空き容量
(バイト単位)
4055449640554496
Nオプションストレージ空き容量
(最適な単位を含む)
38.7MB38.7MB
oオプションストレージ使用容量
(バイト単位)
2655436826554368
Oオプションストレージ使用容量
(最適な単位を含む)
25.3MB25.3MB
pオプションストレージ空き比率
(%単位)
6060
Pオプションストレージ使用比率
(%単位)
3939
rRAM全容量
(バイト単位)
6710886467108864
RRAM全容量
(最適な単位を含む)
64.0MB64.0MB
sRAM空き容量
(バイト単位)
4055449640554496
SRAM空き容量
(最適な単位を含む)
38.7MB38.7MB
tRAM使用容量
(バイト単位)
2655436826554368
TRAM使用容量
(最適な単位を含む)
25.3MB25.3MB
uRAM空き比率
(%単位)
6060
URAM使用比率
(%単位)
3939


!」:電波情報分類


受信している電波の状況といった情報に展開されるエスケープキャラクタです。

記号意味表示例
日本語英語
BWi-Fi接続のベースSSID00:00:00:00:00:0000:00:00:00:00:00
D現在使用中のデータ通信種類WIFI
HSDPA
...
WIFI HSDPA
...
Eモバイルデータ通信の接続状態切断
確立中
 確立済
停止
disconnected
connecting
connected
suspended
Fモバイルデータ通信オペレータ名NTT DOCOMONTT DOCOMO
IWi-Fi接続のIPアドレス192.168.0.254192.168.0.254
LWi-Fi接続のリンク速度54Mbps54Mbps
MWi-Fi接続のMacアドレス00:00:00:00:00:0000:00:00:00:00:00
O音声通話オペレータ名NTT DOCOMONTT DOCOMO
p音声通話用電波強度
( dBm 単位) *1
-97-97
P音声通話用電波強度
( ASU 単位) *2
88
Q音声通話サービス状態電源オフ
緊急通報のみ
 圏外
圏内
power off
emergency only
out of service
in service
SWi-Fi接続のSSID000000000000000000000000
T音声通話種類GSM
CDMA
SIP
NONE
GSM
CDMA
SIP
NONE
wWi-Fi電波強度
( dBm 単位)
-76-76
XWi-Fi接続状態不明
切断
切断中
接続中
接続
unknown
disabled
disabling
enabling
enabled
*1 回線方式がGSM/W-CDMAの場合、ASUから変換される
*2 回線方式がCDMA2000の場合、dBmから変換され


?」:通知情報分類


ユーザーへの通知に関する情報に展開されるエスケープキャラクタです。

記号意味表示例
日本語英語
GGmailの受信通知と未読数 *122
*1 未読数がゼロの場合、およびGmailアプリ起動後は「0」となる


%」:天気情報分類


設定された地点における天気情報に展開されるエスケープキャラクタです。

『Glaeja』ver.4.7.0より、天気情報の取得先が複数になり、取得先に応じて展開文字が異なるようになりました。

取得先に
  • 「ひとくち予報 in Feed」を使用している場合の展開文字はこちら
  • 「OpenWeatherMap」を使用している場合に展開文字はこちら
 を参照してください。


~」:システム設定情報分類


端末のシステム設定に関する情報に展開されるエスケープキャラクタです。

記号意味表示例
日本語英語
aアラーム音量の現在設定値55
Aアラーム音量の最大値77
B現在のマナーモード設定通常
バイブレーション
サイレント
normal
vibrate
silent
c画面明るさの現在設定値(0 - 255)128128
C画面明るさ自動設定の現在の状態手動
自動
manual
automatic
dダイアルトーン音量の現在設定値1212
Dダイアルトーン音量の最大値1515
G現在のGPSの状態オン
オフ
on
off
hウィジェット垂直ピクセル数200200
H端末画面垂直ピクセル数800800
i160dpiに対する端末画面解像度比1.51.5
I端末画面解像度(dpi)240240
k現在のスキン名 ※1untitleduntitled
K全てのスキン呼び出し順序 ※2parent,childparent,child
l次回アラームの原文 ※3土 1:07Sat 1:07
L次回アラーム日時を
$yyyyMMddHHmm$で取得
201210130107201210130107
mメディア再生音量の現在設定値1010
Mメディア再生音量の最大値1515
n通知音量の現在設定値44
N通知音量の最大値77
P現在の機内モードの状態オン
オフ
on
off
r着信音量の現在設定値66
R着信音量の最大値77
sシステム音量の現在設定値33
Sシステム音量の最大値77
T現在のBluetoothの状態オン
オフ
on
off
v通話音量の現在設定値44
V通話音量の最大値55
wウィジェット水平ピクセル数160160
W端末画面水平ピクセル数480480
※1 拡張子「.skin」は省かれる
※2 拡張子「.skin」省かれたスキン名が、呼び出し順序の大元からコンマ区切りで出力される
※3 「~l~」のみレイヤーのロケールが無視され、システムの設定言語の影響を受ける。レイヤーのロケールに関係なく、システムの設定言語が日本語なら「土 1:07」、英語なら「Sat 1:07」のように展開される。またシステムの時間表記が12時間の場合には「金 2:34 am」のように展開される。


解説は以上です。

17 件のコメント:

匿名 さんのコメント...

いつも参考にさせてもらっています。

質問させてもらってもいいですか?
NGならば削除お願いいたします。

Glaejaで祝日名を表示させようとしているのですが、設定の方法がわかりません。

カレンダー情報に展開されるエスケープキャラクタで解決できると思うのですが、キャラクタがわかりません。

ご教授ください。

kanitawa さんのコメント...

う~ん……

昔みたいにすべての祝日が日付固定ならなんとかできそうなんですが、
いまは「X月の第Y月曜日」とかの祝日があるから難しいでしょうねぇ。
それに春分・秋分の日は、毎年日付が変化しますからねぇ。

不可能ではないですが、かなり面倒かつ難しいですよ。

匿名 さんのコメント...

さっそく回答ありがとうございます。

そうですか。。。ZooperWidgetでは『#COTITLE#』FirstEventTitel
という値で取得可能でした。

厳密にいえば祝日名ではなさそうですが、同じような方法でカレンダーから取得とかもできないでしょうか?

kanitawa さんのコメント...

そもそも、『Glaeja』に「今日が祝日かどうか判定する」機能や「祝日名を取得する」機能を実装してないので無理です。

kanitawa さんのコメント...

ああ、『Glaeja』には「スマホ内にあるカレンダーから今日の予定等を取得する」機能もありません。
お書きになられているZooperの機能はこれですね。

匿名 さんのコメント...

そうですか。わかりました。教えていただきありがとうございました。

また分からない事などありましたら、ご教授おねがいいたします

kanitawa さんのコメント...

ggさん、こちらの手違いでコメントを削除してしまいました。すみませんm(__)m

> いじるのが楽しく、狂ったように使わせてもらっています。

> 1点質問なのですが、Wi-Fi接続中であっても、
> その時点でキャッチできている
> 通信回線種別(LTE、HSDPA等)を
> 表示させる方法はないでしょうか?

> 「!D!」だと、Wi-Fi接続中は有無を言わさず
> 「WIFI」の表示になってしまうので・・・。

「!D!」はデータ通信種別なので、WI-FI掴んでると「WIFI」になります。
WI-FI掴んだ時点で、それまで掴んでたコネクション(LTE等)は破棄されますので、
おっしゃられているようなことは無理ですね。

gg さんのコメント...

> 「!D!」はデータ通信種別なので、WI-FI掴んでると「WIFI」になります。
> WI-FI掴んだ時点で、それまで掴んでたコネクション(LTE等)は破棄されますので、
> おっしゃられているようなことは無理ですね。
左様でしたか。ご回答いただきありがとうございます!

Wi-Fi切った時に繋がるであろうコネクション種別が
ウィジェット上で分かったら、と思ったのですが、
今回はとりあえず別のsignal表示系のウィジェットと合わせて使おうと思います。

匿名 さんのコメント...

はじめまして
リッチテキストレイヤーで~L~を使おうとしたのですが、
ロケールを日本語にしないと値が出てこないみたいです。
他のテキスト系レイヤーではロケール関係なく表示できます。
Android 4.4.2、Glaeja 4.4.2です。

kanitawa さんのコメント...

何バカなことを、原理的にありえん……うわホンマやw

…ちょっと調査しますが年末年始は帰省するので修正は年明けになります(;´Д`)

kanitawa さんのコメント...

原因がわかり、手元の開発版で修正を確認しましたが、
申し訳ないですが公開は年明けまで待って下さい。

その間は、お手数ですがリッチテキストでは「~L~」だけ
単独の文字列にしてロケールを日本語にしてやってください。

匿名 さんのコメント...

トリガーを複数のレイヤーにかける方法はありますか?お願いします。

kanitawa さんのコメント...

ありません。

匿名 さんのコメント...

今のこの時間の$C$が-0.2となります。なんでしょうか?

kanitawa さんのコメント...

あ~~、これは計算誤差というか値の切り替え(0~29)が上手くいってないですねぇ。
2015/01/20はちょうど新月になる日で(下記URL参照)

http://www.hottatakeshi.com/moon.html

この日は月齢が29から0へ戻される日になるのですが、
『Glaeja』で利用させていただいている計算式では、
このゼロへ戻す際に若干の計算誤差が発生し、
ゼロを飛び越えてマイナスが発生することがあるようです。
(計算式は以下URLのものを利用させていただいています)

http://news.local-group.jp/moonage/moonage.js.txt

……ちょっとトリビアルなので修正するかどうか微妙ですねぇ
申し訳ありませんが m(_ _)m

匿名 さんのコメント...

%r%の降水確率を2桁表示ってできますか?(010/→10/)

kanitawa さんのコメント...

%r%はコンマやスラッシュが含まれてるので、@...@を駆使して切り出すのも不可能ではありませんが面倒ではありますね。
まぁ@...@を駆使するしかありませんので、以下を参考に頑張ってください。

http://bananawani-mc.blogspot.jp/2011/10/android.html

単純に明日以降の降水確率を知りたいのなら、以下を参考に%S%を使ったほうが楽ちんでしょう。

http://bananawani-mc.blogspot.jp/2013/12/glaeja_11.html