[NUI]Add xaml support for nui and nui xaml test sample (#230)
[platform/core/csapi/tizenfx.git] / src / Tizen.NUI / src / internal / XamlBinding / StyleSheets / CssReader.cs
1 using System;
2 using System.Collections.Generic;
3 using System.IO;
4
5 namespace Tizen.NUI.StyleSheets
6 {
7         sealed class CssReader : TextReader
8         {
9                 readonly TextReader _reader;
10
11                 public CssReader(TextReader reader)
12                 {
13                         if (reader == null)
14                                 throw new ArgumentNullException(nameof(reader));
15
16                         _reader = reader;
17                 }
18
19                 readonly Queue<char> _cache = new Queue<char>();
20
21                 //skip comments
22                 //TODO unescape escaped sequences
23                 public override int Peek()
24                 {
25                         if (_cache.Count > 0)
26                                 return _cache.Peek();
27
28                         int p = _reader.Peek();
29                         if (p <= 0)
30                                 return p;
31                         if (unchecked((char)p) != '/')
32                                 return p;
33
34                         _cache.Enqueue(unchecked((char)_reader.Read()));
35                         p = _reader.Peek();
36                         if (p <= 0)
37                                 return _cache.Peek();
38                         if (unchecked((char)p) != '*')
39                                 return _cache.Peek();
40
41                         _cache.Clear();
42                         _reader.Read(); //consume the '*'
43
44                         bool hasStar = false;
45                         while (true) {
46                                 var next = _reader.Read();
47                                 if (next <= 0)
48                                         return next;
49                                 if (unchecked((char)next) == '*')
50                                         hasStar = true;
51                                 else if (hasStar && unchecked((char)next) == '/')
52                                         return Peek(); //recursively call self for comments following comments
53                                 else
54                                         hasStar = false;
55                         }
56                 }
57
58                 //skip comments
59                 //TODO unescape escaped sequences
60                 public override int Read()
61                 {
62                         if (_cache.Count > 0)
63                                 return _cache.Dequeue();
64
65                         int p = _reader.Read();
66                         if (p <= 0)
67                                 return p;
68                         var c = unchecked((char)p);
69                         if (c != '/')
70                                 return p;
71
72                         _cache.Enqueue(c);
73                         p = _reader.Read();
74                         if (p <= 0)
75                                 return _cache.Dequeue();
76                         c = unchecked((char)p);
77                         if (c != '*')
78                                 return _cache.Dequeue();
79
80                         _cache.Clear();
81                         _reader.Read(); //consume the '*'
82
83                         bool hasStar = false;
84                         while (true) {
85                                 var next = _reader.Read();
86                                 if (next <= 0)
87                                         return next;
88                                 if (unchecked((char)next) == '*')
89                                         hasStar = true;
90                                 else if (hasStar && unchecked((char)next) == '/')
91                                         return Read(); //recursively call self for comments following comments
92                                 else
93                                         hasStar = false;
94                         }
95                 }
96         }
97 }