LDF超絶仕様書  第2版(ぇ

*いんとろだくしょん*(導入部

	LiteDataFormat(略してLDF)は、肥大化するWebのデータをスマートに伝達するために生まれました。
	「必要なデータ以外を見えなくする」の元に見易さを失わない程度に改良を重ねました。
	このフォーマットの利点は、「軽量」であることのほかに、バイナリデータを扱える点にあります。

終わり。

*はうとぅーゆーず*(基本的な構造

	次は簡単なLDFデータの例です。

\\\For example\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
<?ldf v=0.2 e=utf8 ?>
<books
    <book
        title = "「ハリー・ポッターと死の秘宝」"
        writer = "J. K. ローリング (著), 松岡 佑子 (翻訳) "
        <info 
            isbn = "978-4915512636"
            price = 3990
        >
    >
// 以下Amazon.co.jpランキングより
    <book title="日本のおかず" writer="西 健一郎 (著)" <info isbn="????" price=1680 >>
    <book title="ゆりちかへ―ママからの伝言" writer="テレニン晃子 (著)" <info isbn="????" price=1365 >>
    <book title="上地雄輔フォト&エッセイ『 上 地 雄 輔 物 語 』" <info isbn="????" price=1600>>
    <book title="田中宥久子の造顔マッサージ DVD付" writer="田中 宥久子 (著)"<info price=1995>>
>
\\\END\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\

  XMLに似た感じですが、大きく異なる点があります。(見りゃわかるかw

      ・閉じタグが無い
      ・テキストノード(?)が無い
      ・"をつけていないところがある
      ・//がコメントになっている
      (・手抜き感が漂う)

  ちなみに、books.book[0].titleは"「ハリー・ポッターと死の秘宝」"になります。(この前ようやく読み終わりました)
おわり。

*名前配列*

  これでもよいのですが、これではLDFの恩恵を受けていません。
  ここで登場するのがLDFの新機能「名前配列」です。(ハッシュのことじゃないよ
  これを使って先のを書き換えてみましょう。
  なおLDFでは、配列の区切り文字に空白文字のスペースを使います。
\\\For example2\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
<?ldf v=0.2 e=utf8 ?>
<books
    {book title writer <info #isbn $price >}
    [
      "「ハリー・ポッターと死の秘宝」"
      "J. K. ローリング (著), 松岡 佑子 (翻訳) "
      [
        978-4915512636
        3990
      ]
    ]
// 以下Amazon.co.jpランキングより
    ["日本のおかず" "西 健一郎 (著)" [ ???? 1680]]
    ["ゆりちかへ―ママからの伝言" "テレニン晃子 (著)" [???? 1365]]
    ["上地雄輔フォト&エッセイ『 上 地 雄 輔 物 語 』" "" [???? 1600]]
    ["田中宥久子の造顔マッサージ DVD付" "田中 宥久子 (著)" ["" 1995]]
>
\\\END\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\

  上の形にすると確かに小さくはなりましたが、ハリポタ以外は少し見にくくなりました。
  もちろん、他のフォーマットでも無駄を除くとそうなるのですが、LDFでは違います。
  これをご覧ください。

\\\For example3\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
{book title
writer
<info #isbn
$price>}

["「ハリー・ポッターと死の秘宝」"
"J. K. ローリング (著), 松岡 佑子 (翻訳) "
[978-4915512636
3990]]

["日本のおかず"
"西 健一郎 (著)"
[????
1680]]

["ゆりちかへ―ママからの伝言"
"テレニン晃子 (著)"
[????
1365]]

["上地雄輔フォト&エッセイ『 上 地 雄 輔 物 語 』"
""
[????
1600]]

["田中宥久子の造顔マッサージ DVD付"
"田中 宥久子 (著)"
[""
1995]]
\\\END\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\

  そう、LDFでは区切り文字に改行も使う事ができるのです。
  また、タブも改行と一緒に「空白文字」として扱われます。

  いままで説明しませんでしたが、#isbnの#や$priceの$には意味があります。
  #にはそのデータが"文字列"であることを示し、$は"数値"であることを示します。
  isbnに限らず、先頭に0が来そうなデータは""でかこむか#を頭につけます。8進数扱いされるのを防ぐ為です。
  LDFは他のフォーマットと違い、文字列に"を必要としません。
  サーバーで生成された日付、IDなどの空白文字や"の入らないデータは"を省略出来ます。
  空白文字や"が入る場合はそれぞれをエスケープしたり、全体を"で囲んだりします。

  ところで、books.book[2].info.priceは何でしょうか?そう、1365ですね。
  では、次のデータでscore["1"].nameはどうなるでしょうか?

\\\For example4\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
<?ldf v=0.2 e=utf8 ?>
{score $student_no #name $japanese $math $english *rank}
[41 "太郎" 80 80 90 2]
[42 "佐藤" 90 60 80 3]
[43 "斎藤" 75 95 92 1]
\\\END\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\

  実は、佐藤君ではありません。*rankに注目しましょう。ここで*は「キー文字列」を意味します。
  つまりrankが"1"な人、即ち斎藤君になります。
  今回は偶然順位がかさならなかったのですが、キーは重複不可なので注意しましょう。
  横軸にも縦軸にも名前が付けられる「名前配列」はいかがだったでしょうか?

終わり。文章なげーよ(ぁぁ

*こまごまとした仕様*(超適当

・宣言部。<?ldf ではじまり ?>\n で終わる。v:LDFバージョン、e:エンコーディング、l:言語。
・コメント。2種類ある。Javascriptと同じ。// で以降行末までコメント。/* から */ の間もコメント。
・変数名規則。名前の付け方は基本的にJavascriptと一緒。
  接頭辞で型指定できるが、必須でないものがほとんど。以下に箇条書き。

	<group : オブジェクトを含むオブジェクト。グループ。
	{namedarray : 名前配列。
	> : グループの終わり。
	} : 名前配列宣言の終わり。あとに[A B C][...]とつづく
	 foo1 : オブジェクト型の変数。普通はこれで十分。これより下の型指定は任意
	#foo2 : 文字列。
	$foo3 : 数値。
	!foo4 : 真偽値。True or False.
	?foo5(A B C ...) : 列挙値。enum。A,B,C,...の中から選ぶ。
	@foo6 : 普通の配列。
	|foo7 : フラグ集合。後述。
	&foo8 : バイナリデータ。後述。

終わり。早っw

*フラグ集合*

  実用的な使い方は以下。

\\\For example5\\ldftext\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\

// 2択クイズ
charenger = <01101111011>
answer = <01101001010>

\\\Javascript\\\\\\\\\\\\\\\\\\\\\\\\\

// LDFのデコード
ldf = ldfdec(ldftext);
count = 0;
for(i=0;i < ldf.answer.length;i++){
    ldf.answer[i] == ldf.charenger[i] ? count++; : count = count;
}
alert("正解数:" + count); // 8

\\\END\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\

  そのまんまフラグ集合です。一文字づつ分解して配列に格納されます。
  season=<春夏秋冬>といった使いかたも可能です。

おしまい。

*バイナリデータ*

  XMLやJSONにはないけれど需要がありそうな機能です。
  バイナリデータを格納する方法は2つあります。

	1.生バイナリを加工する
	  
	  bindata = ~加工済み生バイナリデータ~
	  
	  //加工といっても簡単で、~を~~に置き換えるだけです。
	  //パース時には~が奇数個きたら最後の1つ前で終了と判断させるので楽ちんです。
+	  (%と~を強制Base64エンコードするのもアリか検討中。)
	  なんと画像もFLASHもそのままファイルに埋め込んでまとめて送信できます!
	  いちいちBase64エンコードしなくてよいので動作も容量も軽いです。

	2.エンコード済みバイナリデータ
	  
	  bindata2 = %文字列化済みバイナリデータ~
	  
	  これには4つのモードがあります。
	  sjisモード、utf8モード、アスキーモード、バイナリモード。
	  共通するのは
			・%と~は強制Base64エンコードすることです。
	  あとはそれぞれの文字コードで表示できない(不正な)文字コードの文字だけ
	  Base64エンコードしていきます(改行・タブ以外の特殊文字を含む)。
	  バイナリモードは文字コードにかかわらず全部Base64エンコードします。

おしまい。


ご精読ありがとうございました。


By Satosi 2008/8/10





第1版はgdgdだった。反省している。

ちなみにこれはpredocで書いた。
inserted by FC2 system