xref: /f-stack/tools/libxo/doc/example.rst (revision d4a07e70)
1*d4a07e70Sfengbojiang
2*d4a07e70SfengbojiangExamples
3*d4a07e70Sfengbojiang========
4*d4a07e70Sfengbojiang
5*d4a07e70SfengbojiangUnit Test
6*d4a07e70Sfengbojiang---------
7*d4a07e70Sfengbojiang
8*d4a07e70SfengbojiangHere is one of the unit tests as an example::
9*d4a07e70Sfengbojiang
10*d4a07e70Sfengbojiang    int
11*d4a07e70Sfengbojiang    main (int argc, char **argv)
12*d4a07e70Sfengbojiang    {
13*d4a07e70Sfengbojiang        static char base_grocery[] = "GRO";
14*d4a07e70Sfengbojiang        static char base_hardware[] = "HRD";
15*d4a07e70Sfengbojiang        struct item {
16*d4a07e70Sfengbojiang            const char *i_title;
17*d4a07e70Sfengbojiang            int i_sold;
18*d4a07e70Sfengbojiang            int i_instock;
19*d4a07e70Sfengbojiang            int i_onorder;
20*d4a07e70Sfengbojiang            const char *i_sku_base;
21*d4a07e70Sfengbojiang            int i_sku_num;
22*d4a07e70Sfengbojiang        };
23*d4a07e70Sfengbojiang        struct item list[] = {
24*d4a07e70Sfengbojiang            { "gum", 1412, 54, 10, base_grocery, 415 },
25*d4a07e70Sfengbojiang            { "rope", 85, 4, 2, base_hardware, 212 },
26*d4a07e70Sfengbojiang            { "ladder", 0, 2, 1, base_hardware, 517 },
27*d4a07e70Sfengbojiang            { "bolt", 4123, 144, 42, base_hardware, 632 },
28*d4a07e70Sfengbojiang            { "water", 17, 14, 2, base_grocery, 2331 },
29*d4a07e70Sfengbojiang            { NULL, 0, 0, 0, NULL, 0 }
30*d4a07e70Sfengbojiang        };
31*d4a07e70Sfengbojiang        struct item list2[] = {
32*d4a07e70Sfengbojiang            { "fish", 1321, 45, 1, base_grocery, 533 },
33*d4a07e70Sfengbojiang        };
34*d4a07e70Sfengbojiang        struct item *ip;
35*d4a07e70Sfengbojiang        xo_info_t info[] = {
36*d4a07e70Sfengbojiang            { "in-stock", "number", "Number of items in stock" },
37*d4a07e70Sfengbojiang            { "name", "string", "Name of the item" },
38*d4a07e70Sfengbojiang            { "on-order", "number", "Number of items on order" },
39*d4a07e70Sfengbojiang            { "sku", "string", "Stock Keeping Unit" },
40*d4a07e70Sfengbojiang            { "sold", "number", "Number of items sold" },
41*d4a07e70Sfengbojiang            { NULL, NULL, NULL },
42*d4a07e70Sfengbojiang        };
43*d4a07e70Sfengbojiang        int info_count = (sizeof(info) / sizeof(info[0])) - 1;
44*d4a07e70Sfengbojiang
45*d4a07e70Sfengbojiang        argc = xo_parse_args(argc, argv);
46*d4a07e70Sfengbojiang        if (argc < 0)
47*d4a07e70Sfengbojiang            exit(EXIT_FAILURE);
48*d4a07e70Sfengbojiang
49*d4a07e70Sfengbojiang        xo_set_info(NULL, info, info_count);
50*d4a07e70Sfengbojiang
51*d4a07e70Sfengbojiang        xo_open_container_h(NULL, "top");
52*d4a07e70Sfengbojiang
53*d4a07e70Sfengbojiang        xo_open_container("data");
54*d4a07e70Sfengbojiang        xo_open_list("item");
55*d4a07e70Sfengbojiang
56*d4a07e70Sfengbojiang        for (ip = list; ip->i_title; ip++) {
57*d4a07e70Sfengbojiang            xo_open_instance("item");
58*d4a07e70Sfengbojiang
59*d4a07e70Sfengbojiang            xo_emit("{L:Item} '{k:name/%s}':\n", ip->i_title);
60*d4a07e70Sfengbojiang            xo_emit("{P:   }{L:Total sold}: {n:sold/%u%s}\n",
61*d4a07e70Sfengbojiang                    ip->i_sold, ip->i_sold ? ".0" : "");
62*d4a07e70Sfengbojiang            xo_emit("{P:   }{Lwc:In stock}{:in-stock/%u}\n",
63*d4a07e70Sfengbojiang                    ip->i_instock);
64*d4a07e70Sfengbojiang            xo_emit("{P:   }{Lwc:On order}{:on-order/%u}\n",
65*d4a07e70Sfengbojiang                    ip->i_onorder);
66*d4a07e70Sfengbojiang            xo_emit("{P:   }{L:SKU}: {q:sku/%s-000-%u}\n",
67*d4a07e70Sfengbojiang                    ip->i_sku_base, ip->i_sku_num);
68*d4a07e70Sfengbojiang
69*d4a07e70Sfengbojiang            xo_close_instance("item");
70*d4a07e70Sfengbojiang        }
71*d4a07e70Sfengbojiang
72*d4a07e70Sfengbojiang        xo_close_list("item");
73*d4a07e70Sfengbojiang        xo_close_container("data");
74*d4a07e70Sfengbojiang
75*d4a07e70Sfengbojiang        xo_open_container("data");
76*d4a07e70Sfengbojiang        xo_open_list("item");
77*d4a07e70Sfengbojiang
78*d4a07e70Sfengbojiang        for (ip = list2; ip->i_title; ip++) {
79*d4a07e70Sfengbojiang            xo_open_instance("item");
80*d4a07e70Sfengbojiang
81*d4a07e70Sfengbojiang            xo_emit("{L:Item} '{:name/%s}':\n", ip->i_title);
82*d4a07e70Sfengbojiang            xo_emit("{P:   }{L:Total sold}: {n:sold/%u%s}\n",
83*d4a07e70Sfengbojiang                    ip->i_sold, ip->i_sold ? ".0" : "");
84*d4a07e70Sfengbojiang            xo_emit("{P:   }{Lwc:In stock}{:in-stock/%u}\n",
85*d4a07e70Sfengbojiang                    ip->i_instock);
86*d4a07e70Sfengbojiang            xo_emit("{P:   }{Lwc:On order}{:on-order/%u}\n",
87*d4a07e70Sfengbojiang                    ip->i_onorder);
88*d4a07e70Sfengbojiang            xo_emit("{P:   }{L:SKU}: {q:sku/%s-000-%u}\n",
89*d4a07e70Sfengbojiang                    ip->i_sku_base, ip->i_sku_num);
90*d4a07e70Sfengbojiang
91*d4a07e70Sfengbojiang            xo_close_instance("item");
92*d4a07e70Sfengbojiang        }
93*d4a07e70Sfengbojiang
94*d4a07e70Sfengbojiang        xo_close_list("item");
95*d4a07e70Sfengbojiang        xo_close_container("data");
96*d4a07e70Sfengbojiang
97*d4a07e70Sfengbojiang        xo_close_container_h(NULL, "top");
98*d4a07e70Sfengbojiang
99*d4a07e70Sfengbojiang        return 0;
100*d4a07e70Sfengbojiang    }
101*d4a07e70Sfengbojiang
102*d4a07e70SfengbojiangText output::
103*d4a07e70Sfengbojiang
104*d4a07e70Sfengbojiang    % ./testxo --libxo text
105*d4a07e70Sfengbojiang    Item 'gum':
106*d4a07e70Sfengbojiang       Total sold: 1412.0
107*d4a07e70Sfengbojiang       In stock: 54
108*d4a07e70Sfengbojiang       On order: 10
109*d4a07e70Sfengbojiang       SKU: GRO-000-415
110*d4a07e70Sfengbojiang    Item 'rope':
111*d4a07e70Sfengbojiang       Total sold: 85.0
112*d4a07e70Sfengbojiang       In stock: 4
113*d4a07e70Sfengbojiang       On order: 2
114*d4a07e70Sfengbojiang       SKU: HRD-000-212
115*d4a07e70Sfengbojiang    Item 'ladder':
116*d4a07e70Sfengbojiang       Total sold: 0
117*d4a07e70Sfengbojiang       In stock: 2
118*d4a07e70Sfengbojiang       On order: 1
119*d4a07e70Sfengbojiang       SKU: HRD-000-517
120*d4a07e70Sfengbojiang    Item 'bolt':
121*d4a07e70Sfengbojiang       Total sold: 4123.0
122*d4a07e70Sfengbojiang       In stock: 144
123*d4a07e70Sfengbojiang       On order: 42
124*d4a07e70Sfengbojiang       SKU: HRD-000-632
125*d4a07e70Sfengbojiang    Item 'water':
126*d4a07e70Sfengbojiang       Total sold: 17.0
127*d4a07e70Sfengbojiang       In stock: 14
128*d4a07e70Sfengbojiang       On order: 2
129*d4a07e70Sfengbojiang       SKU: GRO-000-2331
130*d4a07e70Sfengbojiang    Item 'fish':
131*d4a07e70Sfengbojiang       Total sold: 1321.0
132*d4a07e70Sfengbojiang       In stock: 45
133*d4a07e70Sfengbojiang       On order: 1
134*d4a07e70Sfengbojiang       SKU: GRO-000-533
135*d4a07e70Sfengbojiang
136*d4a07e70SfengbojiangJSON output::
137*d4a07e70Sfengbojiang
138*d4a07e70Sfengbojiang    % ./testxo --libxo json,pretty
139*d4a07e70Sfengbojiang    "top": {
140*d4a07e70Sfengbojiang      "data": {
141*d4a07e70Sfengbojiang        "item": [
142*d4a07e70Sfengbojiang          {
143*d4a07e70Sfengbojiang            "name": "gum",
144*d4a07e70Sfengbojiang            "sold": 1412.0,
145*d4a07e70Sfengbojiang            "in-stock": 54,
146*d4a07e70Sfengbojiang            "on-order": 10,
147*d4a07e70Sfengbojiang            "sku": "GRO-000-415"
148*d4a07e70Sfengbojiang          },
149*d4a07e70Sfengbojiang          {
150*d4a07e70Sfengbojiang            "name": "rope",
151*d4a07e70Sfengbojiang            "sold": 85.0,
152*d4a07e70Sfengbojiang            "in-stock": 4,
153*d4a07e70Sfengbojiang            "on-order": 2,
154*d4a07e70Sfengbojiang            "sku": "HRD-000-212"
155*d4a07e70Sfengbojiang          },
156*d4a07e70Sfengbojiang          {
157*d4a07e70Sfengbojiang            "name": "ladder",
158*d4a07e70Sfengbojiang            "sold": 0,
159*d4a07e70Sfengbojiang            "in-stock": 2,
160*d4a07e70Sfengbojiang            "on-order": 1,
161*d4a07e70Sfengbojiang            "sku": "HRD-000-517"
162*d4a07e70Sfengbojiang          },
163*d4a07e70Sfengbojiang          {
164*d4a07e70Sfengbojiang            "name": "bolt",
165*d4a07e70Sfengbojiang            "sold": 4123.0,
166*d4a07e70Sfengbojiang            "in-stock": 144,
167*d4a07e70Sfengbojiang            "on-order": 42,
168*d4a07e70Sfengbojiang            "sku": "HRD-000-632"
169*d4a07e70Sfengbojiang          },
170*d4a07e70Sfengbojiang          {
171*d4a07e70Sfengbojiang            "name": "water",
172*d4a07e70Sfengbojiang            "sold": 17.0,
173*d4a07e70Sfengbojiang            "in-stock": 14,
174*d4a07e70Sfengbojiang            "on-order": 2,
175*d4a07e70Sfengbojiang            "sku": "GRO-000-2331"
176*d4a07e70Sfengbojiang          }
177*d4a07e70Sfengbojiang        ]
178*d4a07e70Sfengbojiang      },
179*d4a07e70Sfengbojiang      "data": {
180*d4a07e70Sfengbojiang        "item": [
181*d4a07e70Sfengbojiang          {
182*d4a07e70Sfengbojiang            "name": "fish",
183*d4a07e70Sfengbojiang            "sold": 1321.0,
184*d4a07e70Sfengbojiang            "in-stock": 45,
185*d4a07e70Sfengbojiang            "on-order": 1,
186*d4a07e70Sfengbojiang            "sku": "GRO-000-533"
187*d4a07e70Sfengbojiang          }
188*d4a07e70Sfengbojiang        ]
189*d4a07e70Sfengbojiang      }
190*d4a07e70Sfengbojiang    }
191*d4a07e70Sfengbojiang
192*d4a07e70SfengbojiangXML output::
193*d4a07e70Sfengbojiang
194*d4a07e70Sfengbojiang    % ./testxo --libxo pretty,xml
195*d4a07e70Sfengbojiang    <top>
196*d4a07e70Sfengbojiang      <data>
197*d4a07e70Sfengbojiang        <item>
198*d4a07e70Sfengbojiang          <name>gum</name>
199*d4a07e70Sfengbojiang          <sold>1412.0</sold>
200*d4a07e70Sfengbojiang          <in-stock>54</in-stock>
201*d4a07e70Sfengbojiang          <on-order>10</on-order>
202*d4a07e70Sfengbojiang          <sku>GRO-000-415</sku>
203*d4a07e70Sfengbojiang        </item>
204*d4a07e70Sfengbojiang        <item>
205*d4a07e70Sfengbojiang          <name>rope</name>
206*d4a07e70Sfengbojiang          <sold>85.0</sold>
207*d4a07e70Sfengbojiang          <in-stock>4</in-stock>
208*d4a07e70Sfengbojiang          <on-order>2</on-order>
209*d4a07e70Sfengbojiang          <sku>HRD-000-212</sku>
210*d4a07e70Sfengbojiang        </item>
211*d4a07e70Sfengbojiang        <item>
212*d4a07e70Sfengbojiang          <name>ladder</name>
213*d4a07e70Sfengbojiang          <sold>0</sold>
214*d4a07e70Sfengbojiang          <in-stock>2</in-stock>
215*d4a07e70Sfengbojiang          <on-order>1</on-order>
216*d4a07e70Sfengbojiang          <sku>HRD-000-517</sku>
217*d4a07e70Sfengbojiang        </item>
218*d4a07e70Sfengbojiang        <item>
219*d4a07e70Sfengbojiang          <name>bolt</name>
220*d4a07e70Sfengbojiang          <sold>4123.0</sold>
221*d4a07e70Sfengbojiang          <in-stock>144</in-stock>
222*d4a07e70Sfengbojiang          <on-order>42</on-order>
223*d4a07e70Sfengbojiang          <sku>HRD-000-632</sku>
224*d4a07e70Sfengbojiang        </item>
225*d4a07e70Sfengbojiang        <item>
226*d4a07e70Sfengbojiang          <name>water</name>
227*d4a07e70Sfengbojiang          <sold>17.0</sold>
228*d4a07e70Sfengbojiang          <in-stock>14</in-stock>
229*d4a07e70Sfengbojiang          <on-order>2</on-order>
230*d4a07e70Sfengbojiang          <sku>GRO-000-2331</sku>
231*d4a07e70Sfengbojiang        </item>
232*d4a07e70Sfengbojiang      </data>
233*d4a07e70Sfengbojiang      <data>
234*d4a07e70Sfengbojiang        <item>
235*d4a07e70Sfengbojiang          <name>fish</name>
236*d4a07e70Sfengbojiang          <sold>1321.0</sold>
237*d4a07e70Sfengbojiang          <in-stock>45</in-stock>
238*d4a07e70Sfengbojiang          <on-order>1</on-order>
239*d4a07e70Sfengbojiang          <sku>GRO-000-533</sku>
240*d4a07e70Sfengbojiang        </item>
241*d4a07e70Sfengbojiang      </data>
242*d4a07e70Sfengbojiang    </top>
243*d4a07e70Sfengbojiang
244*d4a07e70SfengbojiangHMTL output::
245*d4a07e70Sfengbojiang
246*d4a07e70Sfengbojiang    % ./testxo --libxo pretty,html
247*d4a07e70Sfengbojiang    <div class="line">
248*d4a07e70Sfengbojiang      <div class="label">Item</div>
249*d4a07e70Sfengbojiang      <div class="text"> '</div>
250*d4a07e70Sfengbojiang      <div class="data" data-tag="name">gum</div>
251*d4a07e70Sfengbojiang      <div class="text">':</div>
252*d4a07e70Sfengbojiang    </div>
253*d4a07e70Sfengbojiang    <div class="line">
254*d4a07e70Sfengbojiang      <div class="padding">   </div>
255*d4a07e70Sfengbojiang      <div class="label">Total sold</div>
256*d4a07e70Sfengbojiang      <div class="text">: </div>
257*d4a07e70Sfengbojiang      <div class="data" data-tag="sold">1412.0</div>
258*d4a07e70Sfengbojiang    </div>
259*d4a07e70Sfengbojiang    <div class="line">
260*d4a07e70Sfengbojiang      <div class="padding">   </div>
261*d4a07e70Sfengbojiang      <div class="label">In stock</div>
262*d4a07e70Sfengbojiang      <div class="decoration">:</div>
263*d4a07e70Sfengbojiang      <div class="padding"> </div>
264*d4a07e70Sfengbojiang      <div class="data" data-tag="in-stock">54</div>
265*d4a07e70Sfengbojiang    </div>
266*d4a07e70Sfengbojiang    <div class="line">
267*d4a07e70Sfengbojiang      <div class="padding">   </div>
268*d4a07e70Sfengbojiang      <div class="label">On order</div>
269*d4a07e70Sfengbojiang      <div class="decoration">:</div>
270*d4a07e70Sfengbojiang      <div class="padding"> </div>
271*d4a07e70Sfengbojiang      <div class="data" data-tag="on-order">10</div>
272*d4a07e70Sfengbojiang    </div>
273*d4a07e70Sfengbojiang    <div class="line">
274*d4a07e70Sfengbojiang      <div class="padding">   </div>
275*d4a07e70Sfengbojiang      <div class="label">SKU</div>
276*d4a07e70Sfengbojiang      <div class="text">: </div>
277*d4a07e70Sfengbojiang      <div class="data" data-tag="sku">GRO-000-415</div>
278*d4a07e70Sfengbojiang    </div>
279*d4a07e70Sfengbojiang    <div class="line">
280*d4a07e70Sfengbojiang      <div class="label">Item</div>
281*d4a07e70Sfengbojiang      <div class="text"> '</div>
282*d4a07e70Sfengbojiang      <div class="data" data-tag="name">rope</div>
283*d4a07e70Sfengbojiang      <div class="text">':</div>
284*d4a07e70Sfengbojiang    </div>
285*d4a07e70Sfengbojiang    <div class="line">
286*d4a07e70Sfengbojiang      <div class="padding">   </div>
287*d4a07e70Sfengbojiang      <div class="label">Total sold</div>
288*d4a07e70Sfengbojiang      <div class="text">: </div>
289*d4a07e70Sfengbojiang      <div class="data" data-tag="sold">85.0</div>
290*d4a07e70Sfengbojiang    </div>
291*d4a07e70Sfengbojiang    <div class="line">
292*d4a07e70Sfengbojiang      <div class="padding">   </div>
293*d4a07e70Sfengbojiang      <div class="label">In stock</div>
294*d4a07e70Sfengbojiang      <div class="decoration">:</div>
295*d4a07e70Sfengbojiang      <div class="padding"> </div>
296*d4a07e70Sfengbojiang      <div class="data" data-tag="in-stock">4</div>
297*d4a07e70Sfengbojiang    </div>
298*d4a07e70Sfengbojiang    <div class="line">
299*d4a07e70Sfengbojiang      <div class="padding">   </div>
300*d4a07e70Sfengbojiang      <div class="label">On order</div>
301*d4a07e70Sfengbojiang      <div class="decoration">:</div>
302*d4a07e70Sfengbojiang      <div class="padding"> </div>
303*d4a07e70Sfengbojiang      <div class="data" data-tag="on-order">2</div>
304*d4a07e70Sfengbojiang    </div>
305*d4a07e70Sfengbojiang    <div class="line">
306*d4a07e70Sfengbojiang      <div class="padding">   </div>
307*d4a07e70Sfengbojiang      <div class="label">SKU</div>
308*d4a07e70Sfengbojiang      <div class="text">: </div>
309*d4a07e70Sfengbojiang      <div class="data" data-tag="sku">HRD-000-212</div>
310*d4a07e70Sfengbojiang    </div>
311*d4a07e70Sfengbojiang    <div class="line">
312*d4a07e70Sfengbojiang      <div class="label">Item</div>
313*d4a07e70Sfengbojiang      <div class="text"> '</div>
314*d4a07e70Sfengbojiang      <div class="data" data-tag="name">ladder</div>
315*d4a07e70Sfengbojiang      <div class="text">':</div>
316*d4a07e70Sfengbojiang    </div>
317*d4a07e70Sfengbojiang    <div class="line">
318*d4a07e70Sfengbojiang      <div class="padding">   </div>
319*d4a07e70Sfengbojiang      <div class="label">Total sold</div>
320*d4a07e70Sfengbojiang      <div class="text">: </div>
321*d4a07e70Sfengbojiang      <div class="data" data-tag="sold">0</div>
322*d4a07e70Sfengbojiang    </div>
323*d4a07e70Sfengbojiang    <div class="line">
324*d4a07e70Sfengbojiang      <div class="padding">   </div>
325*d4a07e70Sfengbojiang      <div class="label">In stock</div>
326*d4a07e70Sfengbojiang      <div class="decoration">:</div>
327*d4a07e70Sfengbojiang      <div class="padding"> </div>
328*d4a07e70Sfengbojiang      <div class="data" data-tag="in-stock">2</div>
329*d4a07e70Sfengbojiang    </div>
330*d4a07e70Sfengbojiang    <div class="line">
331*d4a07e70Sfengbojiang      <div class="padding">   </div>
332*d4a07e70Sfengbojiang      <div class="label">On order</div>
333*d4a07e70Sfengbojiang      <div class="decoration">:</div>
334*d4a07e70Sfengbojiang      <div class="padding"> </div>
335*d4a07e70Sfengbojiang      <div class="data" data-tag="on-order">1</div>
336*d4a07e70Sfengbojiang    </div>
337*d4a07e70Sfengbojiang    <div class="line">
338*d4a07e70Sfengbojiang      <div class="padding">   </div>
339*d4a07e70Sfengbojiang      <div class="label">SKU</div>
340*d4a07e70Sfengbojiang      <div class="text">: </div>
341*d4a07e70Sfengbojiang      <div class="data" data-tag="sku">HRD-000-517</div>
342*d4a07e70Sfengbojiang    </div>
343*d4a07e70Sfengbojiang    <div class="line">
344*d4a07e70Sfengbojiang      <div class="label">Item</div>
345*d4a07e70Sfengbojiang      <div class="text"> '</div>
346*d4a07e70Sfengbojiang      <div class="data" data-tag="name">bolt</div>
347*d4a07e70Sfengbojiang      <div class="text">':</div>
348*d4a07e70Sfengbojiang    </div>
349*d4a07e70Sfengbojiang    <div class="line">
350*d4a07e70Sfengbojiang      <div class="padding">   </div>
351*d4a07e70Sfengbojiang      <div class="label">Total sold</div>
352*d4a07e70Sfengbojiang      <div class="text">: </div>
353*d4a07e70Sfengbojiang      <div class="data" data-tag="sold">4123.0</div>
354*d4a07e70Sfengbojiang    </div>
355*d4a07e70Sfengbojiang    <div class="line">
356*d4a07e70Sfengbojiang      <div class="padding">   </div>
357*d4a07e70Sfengbojiang      <div class="label">In stock</div>
358*d4a07e70Sfengbojiang      <div class="decoration">:</div>
359*d4a07e70Sfengbojiang      <div class="padding"> </div>
360*d4a07e70Sfengbojiang      <div class="data" data-tag="in-stock">144</div>
361*d4a07e70Sfengbojiang    </div>
362*d4a07e70Sfengbojiang    <div class="line">
363*d4a07e70Sfengbojiang      <div class="padding">   </div>
364*d4a07e70Sfengbojiang      <div class="label">On order</div>
365*d4a07e70Sfengbojiang      <div class="decoration">:</div>
366*d4a07e70Sfengbojiang      <div class="padding"> </div>
367*d4a07e70Sfengbojiang      <div class="data" data-tag="on-order">42</div>
368*d4a07e70Sfengbojiang    </div>
369*d4a07e70Sfengbojiang    <div class="line">
370*d4a07e70Sfengbojiang      <div class="padding">   </div>
371*d4a07e70Sfengbojiang      <div class="label">SKU</div>
372*d4a07e70Sfengbojiang      <div class="text">: </div>
373*d4a07e70Sfengbojiang      <div class="data" data-tag="sku">HRD-000-632</div>
374*d4a07e70Sfengbojiang    </div>
375*d4a07e70Sfengbojiang    <div class="line">
376*d4a07e70Sfengbojiang      <div class="label">Item</div>
377*d4a07e70Sfengbojiang      <div class="text"> '</div>
378*d4a07e70Sfengbojiang      <div class="data" data-tag="name">water</div>
379*d4a07e70Sfengbojiang      <div class="text">':</div>
380*d4a07e70Sfengbojiang    </div>
381*d4a07e70Sfengbojiang    <div class="line">
382*d4a07e70Sfengbojiang      <div class="padding">   </div>
383*d4a07e70Sfengbojiang      <div class="label">Total sold</div>
384*d4a07e70Sfengbojiang      <div class="text">: </div>
385*d4a07e70Sfengbojiang      <div class="data" data-tag="sold">17.0</div>
386*d4a07e70Sfengbojiang    </div>
387*d4a07e70Sfengbojiang    <div class="line">
388*d4a07e70Sfengbojiang      <div class="padding">   </div>
389*d4a07e70Sfengbojiang      <div class="label">In stock</div>
390*d4a07e70Sfengbojiang      <div class="decoration">:</div>
391*d4a07e70Sfengbojiang      <div class="padding"> </div>
392*d4a07e70Sfengbojiang      <div class="data" data-tag="in-stock">14</div>
393*d4a07e70Sfengbojiang    </div>
394*d4a07e70Sfengbojiang    <div class="line">
395*d4a07e70Sfengbojiang      <div class="padding">   </div>
396*d4a07e70Sfengbojiang      <div class="label">On order</div>
397*d4a07e70Sfengbojiang      <div class="decoration">:</div>
398*d4a07e70Sfengbojiang      <div class="padding"> </div>
399*d4a07e70Sfengbojiang      <div class="data" data-tag="on-order">2</div>
400*d4a07e70Sfengbojiang    </div>
401*d4a07e70Sfengbojiang    <div class="line">
402*d4a07e70Sfengbojiang      <div class="padding">   </div>
403*d4a07e70Sfengbojiang      <div class="label">SKU</div>
404*d4a07e70Sfengbojiang      <div class="text">: </div>
405*d4a07e70Sfengbojiang      <div class="data" data-tag="sku">GRO-000-2331</div>
406*d4a07e70Sfengbojiang    </div>
407*d4a07e70Sfengbojiang    <div class="line">
408*d4a07e70Sfengbojiang      <div class="label">Item</div>
409*d4a07e70Sfengbojiang      <div class="text"> '</div>
410*d4a07e70Sfengbojiang      <div class="data" data-tag="name">fish</div>
411*d4a07e70Sfengbojiang      <div class="text">':</div>
412*d4a07e70Sfengbojiang    </div>
413*d4a07e70Sfengbojiang    <div class="line">
414*d4a07e70Sfengbojiang      <div class="padding">   </div>
415*d4a07e70Sfengbojiang      <div class="label">Total sold</div>
416*d4a07e70Sfengbojiang      <div class="text">: </div>
417*d4a07e70Sfengbojiang      <div class="data" data-tag="sold">1321.0</div>
418*d4a07e70Sfengbojiang    </div>
419*d4a07e70Sfengbojiang    <div class="line">
420*d4a07e70Sfengbojiang      <div class="padding">   </div>
421*d4a07e70Sfengbojiang      <div class="label">In stock</div>
422*d4a07e70Sfengbojiang      <div class="decoration">:</div>
423*d4a07e70Sfengbojiang      <div class="padding"> </div>
424*d4a07e70Sfengbojiang      <div class="data" data-tag="in-stock">45</div>
425*d4a07e70Sfengbojiang    </div>
426*d4a07e70Sfengbojiang    <div class="line">
427*d4a07e70Sfengbojiang      <div class="padding">   </div>
428*d4a07e70Sfengbojiang      <div class="label">On order</div>
429*d4a07e70Sfengbojiang      <div class="decoration">:</div>
430*d4a07e70Sfengbojiang      <div class="padding"> </div>
431*d4a07e70Sfengbojiang      <div class="data" data-tag="on-order">1</div>
432*d4a07e70Sfengbojiang    </div>
433*d4a07e70Sfengbojiang    <div class="line">
434*d4a07e70Sfengbojiang      <div class="padding">   </div>
435*d4a07e70Sfengbojiang      <div class="label">SKU</div>
436*d4a07e70Sfengbojiang      <div class="text">: </div>
437*d4a07e70Sfengbojiang      <div class="data" data-tag="sku">GRO-000-533</div>
438*d4a07e70Sfengbojiang    </div>
439*d4a07e70Sfengbojiang
440*d4a07e70SfengbojiangHTML output with xpath and info flags::
441*d4a07e70Sfengbojiang
442*d4a07e70Sfengbojiang    % ./testxo --libxo pretty,html,xpath,info
443*d4a07e70Sfengbojiang    <div class="line">
444*d4a07e70Sfengbojiang      <div class="label">Item</div>
445*d4a07e70Sfengbojiang      <div class="text"> '</div>
446*d4a07e70Sfengbojiang      <div class="data" data-tag="name"
447*d4a07e70Sfengbojiang           data-xpath="/top/data/item/name" data-type="string"
448*d4a07e70Sfengbojiang           data-help="Name of the item">gum</div>
449*d4a07e70Sfengbojiang      <div class="text">':</div>
450*d4a07e70Sfengbojiang    </div>
451*d4a07e70Sfengbojiang    <div class="line">
452*d4a07e70Sfengbojiang      <div class="padding">   </div>
453*d4a07e70Sfengbojiang      <div class="label">Total sold</div>
454*d4a07e70Sfengbojiang      <div class="text">: </div>
455*d4a07e70Sfengbojiang      <div class="data" data-tag="sold"
456*d4a07e70Sfengbojiang           data-xpath="/top/data/item/sold" data-type="number"
457*d4a07e70Sfengbojiang           data-help="Number of items sold">1412.0</div>
458*d4a07e70Sfengbojiang    </div>
459*d4a07e70Sfengbojiang    <div class="line">
460*d4a07e70Sfengbojiang      <div class="padding">   </div>
461*d4a07e70Sfengbojiang      <div class="label">In stock</div>
462*d4a07e70Sfengbojiang      <div class="decoration">:</div>
463*d4a07e70Sfengbojiang      <div class="padding"> </div>
464*d4a07e70Sfengbojiang      <div class="data" data-tag="in-stock"
465*d4a07e70Sfengbojiang           data-xpath="/top/data/item/in-stock" data-type="number"
466*d4a07e70Sfengbojiang           data-help="Number of items in stock">54</div>
467*d4a07e70Sfengbojiang    </div>
468*d4a07e70Sfengbojiang    <div class="line">
469*d4a07e70Sfengbojiang      <div class="padding">   </div>
470*d4a07e70Sfengbojiang      <div class="label">On order</div>
471*d4a07e70Sfengbojiang      <div class="decoration">:</div>
472*d4a07e70Sfengbojiang      <div class="padding"> </div>
473*d4a07e70Sfengbojiang      <div class="data" data-tag="on-order"
474*d4a07e70Sfengbojiang           data-xpath="/top/data/item/on-order" data-type="number"
475*d4a07e70Sfengbojiang           data-help="Number of items on order">10</div>
476*d4a07e70Sfengbojiang    </div>
477*d4a07e70Sfengbojiang    <div class="line">
478*d4a07e70Sfengbojiang      <div class="padding">   </div>
479*d4a07e70Sfengbojiang      <div class="label">SKU</div>
480*d4a07e70Sfengbojiang      <div class="text">: </div>
481*d4a07e70Sfengbojiang      <div class="data" data-tag="sku"
482*d4a07e70Sfengbojiang           data-xpath="/top/data/item/sku" data-type="string"
483*d4a07e70Sfengbojiang           data-help="Stock Keeping Unit">GRO-000-415</div>
484*d4a07e70Sfengbojiang    </div>
485*d4a07e70Sfengbojiang    <div class="line">
486*d4a07e70Sfengbojiang      <div class="label">Item</div>
487*d4a07e70Sfengbojiang      <div class="text"> '</div>
488*d4a07e70Sfengbojiang      <div class="data" data-tag="name"
489*d4a07e70Sfengbojiang           data-xpath="/top/data/item/name" data-type="string"
490*d4a07e70Sfengbojiang           data-help="Name of the item">rope</div>
491*d4a07e70Sfengbojiang      <div class="text">':</div>
492*d4a07e70Sfengbojiang    </div>
493*d4a07e70Sfengbojiang    <div class="line">
494*d4a07e70Sfengbojiang      <div class="padding">   </div>
495*d4a07e70Sfengbojiang      <div class="label">Total sold</div>
496*d4a07e70Sfengbojiang      <div class="text">: </div>
497*d4a07e70Sfengbojiang      <div class="data" data-tag="sold"
498*d4a07e70Sfengbojiang           data-xpath="/top/data/item/sold" data-type="number"
499*d4a07e70Sfengbojiang           data-help="Number of items sold">85.0</div>
500*d4a07e70Sfengbojiang    </div>
501*d4a07e70Sfengbojiang    <div class="line">
502*d4a07e70Sfengbojiang      <div class="padding">   </div>
503*d4a07e70Sfengbojiang      <div class="label">In stock</div>
504*d4a07e70Sfengbojiang      <div class="decoration">:</div>
505*d4a07e70Sfengbojiang      <div class="padding"> </div>
506*d4a07e70Sfengbojiang      <div class="data" data-tag="in-stock"
507*d4a07e70Sfengbojiang           data-xpath="/top/data/item/in-stock" data-type="number"
508*d4a07e70Sfengbojiang           data-help="Number of items in stock">4</div>
509*d4a07e70Sfengbojiang    </div>
510*d4a07e70Sfengbojiang    <div class="line">
511*d4a07e70Sfengbojiang      <div class="padding">   </div>
512*d4a07e70Sfengbojiang      <div class="label">On order</div>
513*d4a07e70Sfengbojiang      <div class="decoration">:</div>
514*d4a07e70Sfengbojiang      <div class="padding"> </div>
515*d4a07e70Sfengbojiang      <div class="data" data-tag="on-order"
516*d4a07e70Sfengbojiang           data-xpath="/top/data/item/on-order" data-type="number"
517*d4a07e70Sfengbojiang           data-help="Number of items on order">2</div>
518*d4a07e70Sfengbojiang    </div>
519*d4a07e70Sfengbojiang    <div class="line">
520*d4a07e70Sfengbojiang      <div class="padding">   </div>
521*d4a07e70Sfengbojiang      <div class="label">SKU</div>
522*d4a07e70Sfengbojiang      <div class="text">: </div>
523*d4a07e70Sfengbojiang      <div class="data" data-tag="sku"
524*d4a07e70Sfengbojiang           data-xpath="/top/data/item/sku" data-type="string"
525*d4a07e70Sfengbojiang           data-help="Stock Keeping Unit">HRD-000-212</div>
526*d4a07e70Sfengbojiang    </div>
527*d4a07e70Sfengbojiang    <div class="line">
528*d4a07e70Sfengbojiang      <div class="label">Item</div>
529*d4a07e70Sfengbojiang      <div class="text"> '</div>
530*d4a07e70Sfengbojiang      <div class="data" data-tag="name"
531*d4a07e70Sfengbojiang           data-xpath="/top/data/item/name" data-type="string"
532*d4a07e70Sfengbojiang           data-help="Name of the item">ladder</div>
533*d4a07e70Sfengbojiang      <div class="text">':</div>
534*d4a07e70Sfengbojiang    </div>
535*d4a07e70Sfengbojiang    <div class="line">
536*d4a07e70Sfengbojiang      <div class="padding">   </div>
537*d4a07e70Sfengbojiang      <div class="label">Total sold</div>
538*d4a07e70Sfengbojiang      <div class="text">: </div>
539*d4a07e70Sfengbojiang      <div class="data" data-tag="sold"
540*d4a07e70Sfengbojiang           data-xpath="/top/data/item/sold" data-type="number"
541*d4a07e70Sfengbojiang           data-help="Number of items sold">0</div>
542*d4a07e70Sfengbojiang    </div>
543*d4a07e70Sfengbojiang    <div class="line">
544*d4a07e70Sfengbojiang      <div class="padding">   </div>
545*d4a07e70Sfengbojiang      <div class="label">In stock</div>
546*d4a07e70Sfengbojiang      <div class="decoration">:</div>
547*d4a07e70Sfengbojiang      <div class="padding"> </div>
548*d4a07e70Sfengbojiang      <div class="data" data-tag="in-stock"
549*d4a07e70Sfengbojiang           data-xpath="/top/data/item/in-stock" data-type="number"
550*d4a07e70Sfengbojiang           data-help="Number of items in stock">2</div>
551*d4a07e70Sfengbojiang    </div>
552*d4a07e70Sfengbojiang    <div class="line">
553*d4a07e70Sfengbojiang      <div class="padding">   </div>
554*d4a07e70Sfengbojiang      <div class="label">On order</div>
555*d4a07e70Sfengbojiang      <div class="decoration">:</div>
556*d4a07e70Sfengbojiang      <div class="padding"> </div>
557*d4a07e70Sfengbojiang      <div class="data" data-tag="on-order"
558*d4a07e70Sfengbojiang           data-xpath="/top/data/item/on-order" data-type="number"
559*d4a07e70Sfengbojiang           data-help="Number of items on order">1</div>
560*d4a07e70Sfengbojiang    </div>
561*d4a07e70Sfengbojiang    <div class="line">
562*d4a07e70Sfengbojiang      <div class="padding">   </div>
563*d4a07e70Sfengbojiang      <div class="label">SKU</div>
564*d4a07e70Sfengbojiang      <div class="text">: </div>
565*d4a07e70Sfengbojiang      <div class="data" data-tag="sku"
566*d4a07e70Sfengbojiang           data-xpath="/top/data/item/sku" data-type="string"
567*d4a07e70Sfengbojiang           data-help="Stock Keeping Unit">HRD-000-517</div>
568*d4a07e70Sfengbojiang    </div>
569*d4a07e70Sfengbojiang    <div class="line">
570*d4a07e70Sfengbojiang      <div class="label">Item</div>
571*d4a07e70Sfengbojiang      <div class="text"> '</div>
572*d4a07e70Sfengbojiang      <div class="data" data-tag="name"
573*d4a07e70Sfengbojiang           data-xpath="/top/data/item/name" data-type="string"
574*d4a07e70Sfengbojiang           data-help="Name of the item">bolt</div>
575*d4a07e70Sfengbojiang      <div class="text">':</div>
576*d4a07e70Sfengbojiang    </div>
577*d4a07e70Sfengbojiang    <div class="line">
578*d4a07e70Sfengbojiang      <div class="padding">   </div>
579*d4a07e70Sfengbojiang      <div class="label">Total sold</div>
580*d4a07e70Sfengbojiang      <div class="text">: </div>
581*d4a07e70Sfengbojiang      <div class="data" data-tag="sold"
582*d4a07e70Sfengbojiang           data-xpath="/top/data/item/sold" data-type="number"
583*d4a07e70Sfengbojiang           data-help="Number of items sold">4123.0</div>
584*d4a07e70Sfengbojiang    </div>
585*d4a07e70Sfengbojiang    <div class="line">
586*d4a07e70Sfengbojiang      <div class="padding">   </div>
587*d4a07e70Sfengbojiang      <div class="label">In stock</div>
588*d4a07e70Sfengbojiang      <div class="decoration">:</div>
589*d4a07e70Sfengbojiang      <div class="padding"> </div>
590*d4a07e70Sfengbojiang      <div class="data" data-tag="in-stock"
591*d4a07e70Sfengbojiang           data-xpath="/top/data/item/in-stock" data-type="number"
592*d4a07e70Sfengbojiang           data-help="Number of items in stock">144</div>
593*d4a07e70Sfengbojiang    </div>
594*d4a07e70Sfengbojiang    <div class="line">
595*d4a07e70Sfengbojiang      <div class="padding">   </div>
596*d4a07e70Sfengbojiang      <div class="label">On order</div>
597*d4a07e70Sfengbojiang      <div class="decoration">:</div>
598*d4a07e70Sfengbojiang      <div class="padding"> </div>
599*d4a07e70Sfengbojiang      <div class="data" data-tag="on-order"
600*d4a07e70Sfengbojiang           data-xpath="/top/data/item/on-order" data-type="number"
601*d4a07e70Sfengbojiang           data-help="Number of items on order">42</div>
602*d4a07e70Sfengbojiang    </div>
603*d4a07e70Sfengbojiang    <div class="line">
604*d4a07e70Sfengbojiang      <div class="padding">   </div>
605*d4a07e70Sfengbojiang      <div class="label">SKU</div>
606*d4a07e70Sfengbojiang      <div class="text">: </div>
607*d4a07e70Sfengbojiang      <div class="data" data-tag="sku"
608*d4a07e70Sfengbojiang           data-xpath="/top/data/item/sku" data-type="string"
609*d4a07e70Sfengbojiang           data-help="Stock Keeping Unit">HRD-000-632</div>
610*d4a07e70Sfengbojiang    </div>
611*d4a07e70Sfengbojiang    <div class="line">
612*d4a07e70Sfengbojiang      <div class="label">Item</div>
613*d4a07e70Sfengbojiang      <div class="text"> '</div>
614*d4a07e70Sfengbojiang      <div class="data" data-tag="name"
615*d4a07e70Sfengbojiang           data-xpath="/top/data/item/name" data-type="string"
616*d4a07e70Sfengbojiang           data-help="Name of the item">water</div>
617*d4a07e70Sfengbojiang      <div class="text">':</div>
618*d4a07e70Sfengbojiang    </div>
619*d4a07e70Sfengbojiang    <div class="line">
620*d4a07e70Sfengbojiang      <div class="padding">   </div>
621*d4a07e70Sfengbojiang      <div class="label">Total sold</div>
622*d4a07e70Sfengbojiang      <div class="text">: </div>
623*d4a07e70Sfengbojiang      <div class="data" data-tag="sold"
624*d4a07e70Sfengbojiang           data-xpath="/top/data/item/sold" data-type="number"
625*d4a07e70Sfengbojiang           data-help="Number of items sold">17.0</div>
626*d4a07e70Sfengbojiang    </div>
627*d4a07e70Sfengbojiang    <div class="line">
628*d4a07e70Sfengbojiang      <div class="padding">   </div>
629*d4a07e70Sfengbojiang      <div class="label">In stock</div>
630*d4a07e70Sfengbojiang      <div class="decoration">:</div>
631*d4a07e70Sfengbojiang      <div class="padding"> </div>
632*d4a07e70Sfengbojiang      <div class="data" data-tag="in-stock"
633*d4a07e70Sfengbojiang           data-xpath="/top/data/item/in-stock" data-type="number"
634*d4a07e70Sfengbojiang           data-help="Number of items in stock">14</div>
635*d4a07e70Sfengbojiang    </div>
636*d4a07e70Sfengbojiang    <div class="line">
637*d4a07e70Sfengbojiang      <div class="padding">   </div>
638*d4a07e70Sfengbojiang      <div class="label">On order</div>
639*d4a07e70Sfengbojiang      <div class="decoration">:</div>
640*d4a07e70Sfengbojiang      <div class="padding"> </div>
641*d4a07e70Sfengbojiang      <div class="data" data-tag="on-order"
642*d4a07e70Sfengbojiang           data-xpath="/top/data/item/on-order" data-type="number"
643*d4a07e70Sfengbojiang           data-help="Number of items on order">2</div>
644*d4a07e70Sfengbojiang    </div>
645*d4a07e70Sfengbojiang    <div class="line">
646*d4a07e70Sfengbojiang      <div class="padding">   </div>
647*d4a07e70Sfengbojiang      <div class="label">SKU</div>
648*d4a07e70Sfengbojiang      <div class="text">: </div>
649*d4a07e70Sfengbojiang      <div class="data" data-tag="sku"
650*d4a07e70Sfengbojiang           data-xpath="/top/data/item/sku" data-type="string"
651*d4a07e70Sfengbojiang           data-help="Stock Keeping Unit">GRO-000-2331</div>
652*d4a07e70Sfengbojiang    </div>
653*d4a07e70Sfengbojiang    <div class="line">
654*d4a07e70Sfengbojiang      <div class="label">Item</div>
655*d4a07e70Sfengbojiang      <div class="text"> '</div>
656*d4a07e70Sfengbojiang      <div class="data" data-tag="name"
657*d4a07e70Sfengbojiang           data-xpath="/top/data/item/name" data-type="string"
658*d4a07e70Sfengbojiang           data-help="Name of the item">fish</div>
659*d4a07e70Sfengbojiang      <div class="text">':</div>
660*d4a07e70Sfengbojiang    </div>
661*d4a07e70Sfengbojiang    <div class="line">
662*d4a07e70Sfengbojiang      <div class="padding">   </div>
663*d4a07e70Sfengbojiang      <div class="label">Total sold</div>
664*d4a07e70Sfengbojiang      <div class="text">: </div>
665*d4a07e70Sfengbojiang      <div class="data" data-tag="sold"
666*d4a07e70Sfengbojiang           data-xpath="/top/data/item/sold" data-type="number"
667*d4a07e70Sfengbojiang           data-help="Number of items sold">1321.0</div>
668*d4a07e70Sfengbojiang    </div>
669*d4a07e70Sfengbojiang    <div class="line">
670*d4a07e70Sfengbojiang      <div class="padding">   </div>
671*d4a07e70Sfengbojiang      <div class="label">In stock</div>
672*d4a07e70Sfengbojiang      <div class="decoration">:</div>
673*d4a07e70Sfengbojiang      <div class="padding"> </div>
674*d4a07e70Sfengbojiang      <div class="data" data-tag="in-stock"
675*d4a07e70Sfengbojiang           data-xpath="/top/data/item/in-stock" data-type="number"
676*d4a07e70Sfengbojiang           data-help="Number of items in stock">45</div>
677*d4a07e70Sfengbojiang    </div>
678*d4a07e70Sfengbojiang    <div class="line">
679*d4a07e70Sfengbojiang      <div class="padding">   </div>
680*d4a07e70Sfengbojiang      <div class="label">On order</div>
681*d4a07e70Sfengbojiang      <div class="decoration">:</div>
682*d4a07e70Sfengbojiang      <div class="padding"> </div>
683*d4a07e70Sfengbojiang      <div class="data" data-tag="on-order"
684*d4a07e70Sfengbojiang           data-xpath="/top/data/item/on-order" data-type="number"
685*d4a07e70Sfengbojiang           data-help="Number of items on order">1</div>
686*d4a07e70Sfengbojiang    </div>
687*d4a07e70Sfengbojiang    <div class="line">
688*d4a07e70Sfengbojiang      <div class="padding">   </div>
689*d4a07e70Sfengbojiang      <div class="label">SKU</div>
690*d4a07e70Sfengbojiang      <div class="text">: </div>
691*d4a07e70Sfengbojiang      <div class="data" data-tag="sku"
692*d4a07e70Sfengbojiang           data-xpath="/top/data/item/sku" data-type="string"
693*d4a07e70Sfengbojiang           data-help="Stock Keeping Unit">GRO-000-533</div>
694*d4a07e70Sfengbojiang    </div>
695