タグ属性の変更とループ処理

ソース

1import std.stdio;
2import std.conv;
3import jp.ku6.sweets.core;
4
5// optionタグに使う値の配列
6string[] OPTIONS = ["ねこみみ""メイド""妹""めがね"];
7
8// optionタグループ中に、現在のインデックスを保持する
9uint currentId;
10
11void main()
12{
13    // ループ処理するdelegate
14    // タグで囲まれた中身はchildrenとして渡されるので、
15    // 中身を出力する場合はchildrenを出力する
16    void foreachProcessor(SweetsPrinter printer, SweetsElement element, const(SweetsNode[]) children)
17    {
18        // 開始タグを出力する
19        element.printStartTag(printer, false);
20
21        // ループ
22        // 今回の場合、<select>タグの中身の<option>タグを複数回出力します
23        foreach (id, value; OPTIONS)
24        {
25            // 処理するIDをoptionPrintProcessorから参照出来るようにします
26            currentId = id;
27
28            // タグの中身を出力する
29            foreach (child; children)
30                child.print(printer);
31        }
32
33        // 終了タグを出力する
34        element.printEndTag(printer);
35    }
36
37    // optionタグを出力する処理
38    void optionPrintProcessor(SweetsPrinter printer, SweetsElement element, const(SweetsNode[]) children)
39    {
40        // 属性を追加して開始タグを出力する
41        // 今回の場合value="currentId"を開始タグに追加します
42        string[string] attributes;
43        attributes["value"] = std.conv.to!string(currentId);
44        element.printStartTagWithAdditionalAttributes(printer, attributes, false);
45
46        // ラベルを出力する
47        printer(OPTIONS[currentId]);
48
49        // 終了タグを出力する
50        element.printEndTag(printer);
51    }
52
53    // データを出力するdelegate
54    void printer(const(char)[] data)
55    {
56        write(data);
57    }
58
59
60    // 解析器を作成
61    auto parser = new SweetsParser;
62
63    // 元のテキストからテンプレートオブジェクトを作成
64    auto tpl = parser.parse("<select s:id=\"hoge\" name=\"fuga\"><option s:id=\"hogeChild\"/></select>");
65
66
67    // テンプレートデータを渡して生成
68    auto sweets = new Sweets(tpl);
69
70    // s:id="hoge"にforeachProcessorを割り当てる
71    sweets.assign("hoge", &foreachProcessor);
72
73    // s:id="hogeChild"にoptionPrintProcessorを割り当てる
74    sweets.assign("hogeChild", &optionPrintProcessor);
75
76    // 割り当てた処理を実行し、結果を出力する
77    sweets.print(&printer);
78}

実行結果

<select name="fuga"><option value="0">ねこみみ</option><option value="1">メイド</option><option value="2">妹</option><option value="3">めがね</option></select>