『Glaeja』のレイヤー設定項目において入力された文字列は、 通常の記述方法であればそのままの形で描画エンジンに解釈されますが、この「エスケープキャラクタ」を用いた記述の場合には、その内容が解析され別の文字列に展開されてから描画エンジンに解釈されます。
本エントリでは、その「エスケープキャラクタ」の概要を解説し、そのうちのシステム情報展開系エスケープキャラクタに関する一覧を記します。
目次
エスケープキャラクタとは
エスケープキャラクタとは、文字列に含まれる特殊記号のことです。『Glaeja』の文字列解析エンジンは、この特殊記号が文字列中にあった場合には、その記号文字で囲まれた部分を読み取り、その記述内容に従って以下の動作をおこないます。
- 囲まれた部分を、システム情報等を表す別の文字列に展開・置換する
- 囲まれた部分より前方(左側)の文字列を置換する(@...@)
- 文字列解析エンジン自体の挙動を変更する(|...|)
エスケープキャラクタ展開の規則
特殊記号文字で囲まれた部分が、どのようなシステム情報に展開されるかは、- 特殊記号文字: システム情報の分類
- 囲まれた部分の文字: 具体的な情報
要するに、システム情報ごとに異なる変換テーブルがあり、エスケープキャラクタで「どのシステム情報の変換テーブルを使うか」を決めて、展開文字で「そのテーブルにあるどの情報を表示するか」を決めるわけです。
例えば、「H」という展開文字はいくつかのシステム情報分類の変換テーブルに重複して存在しますが、カレンダー情報分類となる「$」の変換テーブルでは[時(0時始まり24時間表記)]、バッテリ情報分類となる「#」の変換テーブルでは[バッテリの健康状態]と、異なる情報に展開されます。
展開文字は文字列解析エンジンにより1文字ずつ解析・展開されていきますが、この展開には以下のような5つの規則があります。
- 異なる展開文字が1文字ずつ並んでいた場合には全て1つずつ展開されていく
- 同じ展開文字が複数並んでいる場合は、その展開文字によって結果が異なる
- 変換テーブルにない文字は展開されず、そのまま出力される
- エスケープキャラクタは「入れ子構造」になれない
- 単一引用符エスケープキャラクタは特殊
a. 異なる展開文字が1文字ずつ並んでいた場合には全て1つずつ展開されていく
例えば、バッテリ充電率を表す「#P#」が「50」と、バッテリ充放電状態を表す「#S#」が「discharging」と展開される場合なら、「#PS#」と並べて記述すると「50discharging」と並んで展開されます。
b. 同じ展開文字が複数並んでいる場合は、その展開文字によって結果が異なる
この規則には、以下の3つの場合があります。
- 数値に展開される場合には個数によって桁数が変化するものがある
例えば、バッテリ充電率を表す「#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桁でゼロパッドされて展開されます。
数値に展開される展開文字の多くが、このような桁数変化を起こします。
- 個数によって展開結果が変わるものがある
例えば、現在の曜日を表す「$E$」の場合(ロケールは英語)、
「$E$」のように「E」を1つだけ記述すると、「Wed」と展開されます。
「$EE$」のように「E」を2つ、「$EEE$」のように3つ記述しても、「Wed」と展開されます。
「$EEEE$」のように「E」を4つ記述すると、「Wednesday」と展開されます。
いくつかの展開文字で、このように個数によって展開結果が異なるものがあります。
- 個数によらず同じものに展開される
例えば、バッテリへの給電種を表す「#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#:バッテリー給電種」として展開され、「$」文字はバッテリ情報分類系変換テーブルにない文字なので、上記 “規則c” によりそのまま出力される、というわけです。
e. 単一引用符エスケープキャラクタは特殊
これは、上記 “規則d” の例外規則になります。
単一引用符「 ' 」は、エスケープキャラクタとして機能する文字で、これに囲まれた文字列は「一切の解析・展開を受けずそのまま出力」される、という「無変換」系エスケープキャラクタです。
例えば、「'#P#'」は「#P#」というように、バッテリ情報分類系変換テーブルによる展開を受けずに出力されます。
そして、この「 ' 」だけは他のエスケープキャラクタで囲まれた内部で一階層の入れ子として機能できます。
例えば、「#'P is 'P#」は「P is 50」と展開されます。
ちなみに、単一引用符そのものを出力するには、「\'」と記述すれば可能です。
システム情報分類ごとの展開文字変換テーブル
以下に、システム情報分類ごとの変換テーブルと、展開文字の一覧を記します。展開文字の変換に関わる“規則b”にあるように、複数並べた場合に展開結果が異なる場合には、それらを併記しています。
「$」:カレンダー情報分類
日付や時刻といったカレンダー情報に展開されるエスケープキャラクタで、その展開文字の多くは[java.text.SimpleDateFormat]で用いられているものが使用可能です。
記号 | 意味 | 表示例 | |
---|---|---|---|
日本語 | 英語 | ||
a | 午前/午後 | 午後 | PM |
b | 基準日時を何日か前にする*1 | ||
B | 基準日時を何日か後にする*1 | ||
C | 現日時における月齢 | 23.3 | 23.3 |
d | 日 | 3 | 3 |
E | 短い曜日名 | 土 | Sat |
EEEE | 長い曜日名 | 土曜日 | Saturday |
f | 週における経過日数 (日曜がゼロ、土曜が6) | 3 | 3 |
g | 和暦元号 | 平成 | 平成 |
G | 紀元 | 西暦 | AD |
h | 時(12時間表記) ※1時始まり | 12 | 12 |
H | 時(24時間表記) ※0時始まり | 0 | 0 |
i | 午前/午後における経過分数 | 91 | 91 |
I | 1日における経過分数 | 811 | 811 |
j | 現日時のユリウス通日 | 2455914.14 | 2455914.14 |
J | 現日時の修正ユリウス通日 | 55913.64 | 55913.64 |
k | 時(24時間表記) ※1時始まり | 24 | 24 |
K | 時(12時間表記) ※0時始まり | 0 | 0 |
l | 今月の全日数 | 31 | 31 |
L | 今年が閏年なら“1” そうでないなら“0” | 1 | 1 |
m | 分 | 7 | 7 |
M | 月(数値) | 9 | 9 |
MMM | 短い月名 | 9月 | Sep |
MMMM | 長い月名 | 9月 | September |
n | 基準日時を何ヶ月か前にする*1 | ||
N | 基準日時を何ヶ月か後にする*1 | ||
v | 基準日時を何週か前にする*1 | ||
V | 基準日時を何週か後にする*1 | ||
x | 基準日時を何年か前にする*1 | ||
X | 基準日時を何年か後にする*1 | ||
yy | 西暦年(下2桁) | 11 | 11 |
yyyy | 西暦年(4桁) | 2011 | 2011 |
Y | 和暦年数 | 23 | 23 |
上の表にない展開文字でも [java.text.SimpleDateFormat]に定義されているものは使用できます。
「#」:バッテリー情報分類
バッテリーの充電率や健康状態といった情報に展開されるエスケープキャラクタです。
記号 | 意味 | 表示例 | |
---|---|---|---|
日本語 | 英語 | ||
G | 給電種 | AC USB | AC USB |
H | 健康状態 | 不明 良好 過熱 死亡 過電圧 未詳 | unknown good overheat dead over voltage unspecified_failure |
l | 充電レベル | 50 | 50 |
P | 充電率(%) | 50 | 50 |
s | 満充電レベル | 100 | 100 |
S | 充放電状態 | 不明 充電中 放電中 充電断 満充電 | unknwon charging discharging not charging full |
T | 温度(℃) | 36.9 | 36.9 |
t | 電池種 | Li-ion | Li-ion |
v | 電圧(mV) | 1234 | 1234 |
V | 電圧(V) | 1.234 | 1.234 |
「&」:メモリ情報分類
RAMや内部ストレージ・SDカードの容量といった情報に展開されるエスケープキャラクタです。
「オプションストレージ」は、[Glaeja設定]→[動作に関する設定]→[オプションストレージのパス]で指定したボリュームに関する情報に展開されます。これを指定することで「ダウンロードキャッシュ(/cache)」や「外付けSDカード(/mnt/sdcard/external_sd)」等の容量情報を展開することが可能です。
記号 | 意味 | 表示例 | |
---|---|---|---|
日本語 | 英語 | ||
e | SDカード全容量 (バイト単位) | 33017856 | 33017856 |
E | SDカード全容量 (最適な単位を含む) | 31.5MB | 31.5MB |
f | SDカード空き容量 (バイト単位) | 30946304 | 30946304 |
F | SDカード空き容量 (最適な単位を含む) | 29.5MB | 29.5MB |
g | SDカード使用容量 (バイト単位) | 2071552 | 2071552 |
G | SDカード使用容量 (最適な単位を含む) | 2.0MB | 2.0MB |
h | SDカード空き比率 (%単位) | 93 | 93 |
H | SDカード使用比率 (%単位) | 6 | 6 |
i | 内部ストレージ全容量 (バイト単位) | 67108864 | 67108864 |
I | 内部ストレージ全容量 (最適な単位を含む) | 64.0MB | 64.0MB |
j | 内部ストレージ空き容量 (バイト単位) | 40554496 | 40554496 |
J | 内部ストレージ空き容量 (最適な単位を含む) | 38.7MB | 38.7MB |
k | 内部ストレージ使用容量 (バイト単位) | 26554368 | 26554368 |
K | 内部ストレージ使用容量 (最適な単位を含む) | 25.3MB | 25.3MB |
l | 内部ストレージ空き比率 (%単位) | 60 | 60 |
L | 内部ストレージ使用比率 (%単位) | 39 | 39 |
m | オプションストレージ全容量 (バイト単位) | 67108864 | 67108864 |
M | オプションストレージ全容量 (最適な単位を含む) | 64.0MB | 64.0MB |
n | オプションストレージ空き容量 (バイト単位) | 40554496 | 40554496 |
N | オプションストレージ空き容量 (最適な単位を含む) | 38.7MB | 38.7MB |
o | オプションストレージ使用容量 (バイト単位) | 26554368 | 26554368 |
O | オプションストレージ使用容量 (最適な単位を含む) | 25.3MB | 25.3MB |
p | オプションストレージ空き比率 (%単位) | 60 | 60 |
P | オプションストレージ使用比率 (%単位) | 39 | 39 |
r | RAM全容量 (バイト単位) | 67108864 | 67108864 |
R | RAM全容量 (最適な単位を含む) | 64.0MB | 64.0MB |
s | RAM空き容量 (バイト単位) | 40554496 | 40554496 |
S | RAM空き容量 (最適な単位を含む) | 38.7MB | 38.7MB |
t | RAM使用容量 (バイト単位) | 26554368 | 26554368 |
T | RAM使用容量 (最適な単位を含む) | 25.3MB | 25.3MB |
u | RAM空き比率 (%単位) | 60 | 60 |
U | RAM使用比率 (%単位) | 39 | 39 |
「!」:電波情報分類
受信している電波の状況といった情報に展開されるエスケープキャラクタです。
記号 | 意味 | 表示例 | |
---|---|---|---|
日本語 | 英語 | ||
B | Wi-Fi接続のベースSSID | 00:00:00:00:00:00 | 00:00:00:00:00:00 |
D | 現在使用中のデータ通信種類 | WIFI HSDPA ... | WIFI
HSDPA ... |
E | モバイルデータ通信の接続状態 | 切断 確立中 確立済 停止 | disconnected connecting connected suspended |
F | モバイルデータ通信オペレータ名 | NTT DOCOMO | NTT DOCOMO |
I | Wi-Fi接続のIPアドレス | 192.168.0.254 | 192.168.0.254 |
L | Wi-Fi接続のリンク速度 | 54Mbps | 54Mbps |
M | Wi-Fi接続のMacアドレス | 00:00:00:00:00:00 | 00:00:00:00:00:00 |
O | 音声通話オペレータ名 | NTT DOCOMO | NTT DOCOMO |
p | 音声通話用電波強度 ( dBm 単位) *1 | -97 | -97 |
P | 音声通話用電波強度 ( ASU 単位) *2 | 8 | 8 |
Q | 音声通話サービス状態 | 電源オフ 緊急通報のみ 圏外 圏内 | power off emergency only out of service in service |
S | Wi-Fi接続のSSID | 000000000000 | 000000000000 |
T | 音声通話種類 | GSM CDMA SIP NONE | GSM CDMA SIP NONE |
w | Wi-Fi電波強度 ( dBm 単位) | -76 | -76 |
X | Wi-Fi接続状態 | 不明 切断 切断中 接続中 接続 | unknown disabled disabling enabling enabled |
*2 回線方式がCDMA2000の場合、dBmから変換される。
「?」:通知情報分類
ユーザーへの通知に関する情報に展開されるエスケープキャラクタです。
記号 | 意味 | 表示例 | |
---|---|---|---|
日本語 | 英語 | ||
G | Gmailの受信通知と未読数 *1 | 2 | 2 |
「%」:天気情報分類
設定された地点における天気情報に展開されるエスケープキャラクタです。
『Glaeja』ver.4.7.0より、天気情報の取得先が複数になり、取得先に応じて展開文字が異なるようになりました。
取得先に
を参照してください。
「~」:システム設定情報分類
端末のシステム設定に関する情報に展開されるエスケープキャラクタです。
記号 | 意味 | 表示例 | |
---|---|---|---|
日本語 | 英語 | ||
a | アラーム音量の現在設定値 | 5 | 5 |
A | アラーム音量の最大値 | 7 | 7 |
B | 現在のマナーモード設定 | 通常 バイブレーション サイレント | normal vibrate silent |
c | 画面明るさの現在設定値(0 - 255) | 128 | 128 |
C | 画面明るさ自動設定の現在の状態 | 手動 自動 | manual automatic |
d | ダイアルトーン音量の現在設定値 | 12 | 12 |
D | ダイアルトーン音量の最大値 | 15 | 15 |
G | 現在のGPSの状態 | オン オフ | on off |
h | ウィジェット垂直ピクセル数 | 200 | 200 |
H | 端末画面垂直ピクセル数 | 800 | 800 |
i | 160dpiに対する端末画面解像度比 | 1.5 | 1.5 |
I | 端末画面解像度(dpi) | 240 | 240 |
k | 現在のスキン名 ※1 | untitled | untitled |
K | 全てのスキン呼び出し順序 ※2 | parent,child | parent,child |
l | 次回アラームの原文 ※3 | 土 1:07 | Sat 1:07 |
L | 次回アラーム日時を $yyyyMMddHHmm$で取得 | 201210130107 | 201210130107 |
m | メディア再生音量の現在設定値 | 10 | 10 |
M | メディア再生音量の最大値 | 15 | 15 |
n | 通知音量の現在設定値 | 4 | 4 |
N | 通知音量の最大値 | 7 | 7 |
P | 現在の機内モードの状態 | オン オフ | on off |
r | 着信音量の現在設定値 | 6 | 6 |
R | 着信音量の最大値 | 7 | 7 |
s | システム音量の現在設定値 | 3 | 3 |
S | システム音量の最大値 | 7 | 7 |
T | 現在のBluetoothの状態 | オン オフ | on off |
v | 通話音量の現在設定値 | 4 | 4 |
V | 通話音量の最大値 | 5 | 5 |
w | ウィジェット水平ピクセル数 | 160 | 160 |
W | 端末画面水平ピクセル数 | 480 | 480 |
※2 拡張子「.skin」が省かれたスキン名が、呼び出し順序の大元からコンマ区切りで出力される。
※3 「~l~」のみレイヤーのロケールが無視され、システムの設定言語の影響を受ける。レイヤーのロケールに関係なく、システムの設定言語が日本語なら「土 1:07」、英語なら「Sat 1:07」のように展開される。またシステムの時間表記が12時間の場合には「金 2:34 am」のように展開される。
解説は以上です。
いつも参考にさせてもらっています。
返信削除質問させてもらってもいいですか?
NGならば削除お願いいたします。
Glaejaで祝日名を表示させようとしているのですが、設定の方法がわかりません。
カレンダー情報に展開されるエスケープキャラクタで解決できると思うのですが、キャラクタがわかりません。
ご教授ください。
う~ん……
削除昔みたいにすべての祝日が日付固定ならなんとかできそうなんですが、
いまは「X月の第Y月曜日」とかの祝日があるから難しいでしょうねぇ。
それに春分・秋分の日は、毎年日付が変化しますからねぇ。
不可能ではないですが、かなり面倒かつ難しいですよ。
さっそく回答ありがとうございます。
返信削除そうですか。。。ZooperWidgetでは『#COTITLE#』FirstEventTitel
という値で取得可能でした。
厳密にいえば祝日名ではなさそうですが、同じような方法でカレンダーから取得とかもできないでしょうか?
そもそも、『Glaeja』に「今日が祝日かどうか判定する」機能や「祝日名を取得する」機能を実装してないので無理です。
削除ああ、『Glaeja』には「スマホ内にあるカレンダーから今日の予定等を取得する」機能もありません。
削除お書きになられているZooperの機能はこれですね。
そうですか。わかりました。教えていただきありがとうございました。
返信削除また分からない事などありましたら、ご教授おねがいいたします
ggさん、こちらの手違いでコメントを削除してしまいました。すみませんm(__)m
返信削除> いじるのが楽しく、狂ったように使わせてもらっています。
> 1点質問なのですが、Wi-Fi接続中であっても、
> その時点でキャッチできている
> 通信回線種別(LTE、HSDPA等)を
> 表示させる方法はないでしょうか?
> 「!D!」だと、Wi-Fi接続中は有無を言わさず
> 「WIFI」の表示になってしまうので・・・。
「!D!」はデータ通信種別なので、WI-FI掴んでると「WIFI」になります。
WI-FI掴んだ時点で、それまで掴んでたコネクション(LTE等)は破棄されますので、
おっしゃられているようなことは無理ですね。
> 「!D!」はデータ通信種別なので、WI-FI掴んでると「WIFI」になります。
返信削除> WI-FI掴んだ時点で、それまで掴んでたコネクション(LTE等)は破棄されますので、
> おっしゃられているようなことは無理ですね。
左様でしたか。ご回答いただきありがとうございます!
Wi-Fi切った時に繋がるであろうコネクション種別が
ウィジェット上で分かったら、と思ったのですが、
今回はとりあえず別のsignal表示系のウィジェットと合わせて使おうと思います。
はじめまして
返信削除リッチテキストレイヤーで~L~を使おうとしたのですが、
ロケールを日本語にしないと値が出てこないみたいです。
他のテキスト系レイヤーではロケール関係なく表示できます。
Android 4.4.2、Glaeja 4.4.2です。
何バカなことを、原理的にありえん……うわホンマやw
削除…ちょっと調査しますが年末年始は帰省するので修正は年明けになります(;´Д`)
原因がわかり、手元の開発版で修正を確認しましたが、
削除申し訳ないですが公開は年明けまで待って下さい。
その間は、お手数ですがリッチテキストでは「~L~」だけ
単独の文字列にしてロケールを日本語にしてやってください。
トリガーを複数のレイヤーにかける方法はありますか?お願いします。
返信削除ありません。
削除今のこの時間の$C$が-0.2となります。なんでしょうか?
返信削除あ~~、これは計算誤差というか値の切り替え(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/)
返信削除%r%はコンマやスラッシュが含まれてるので、@...@を駆使して切り出すのも不可能ではありませんが面倒ではありますね。
削除まぁ@...@を駆使するしかありませんので、以下を参考に頑張ってください。
http://bananawani-mc.blogspot.jp/2011/10/android.html
単純に明日以降の降水確率を知りたいのなら、以下を参考に%S%を使ったほうが楽ちんでしょう。
http://bananawani-mc.blogspot.jp/2013/12/glaeja_11.html