TermList.cs 3.33 KB
Newer Older
Eric Domke's avatar
Eric Domke committed
1
2
3
4
5
6
using System;
using System.Collections.Generic;
using System.Runtime.CompilerServices;
using System.Text;

// ReSharper disable once CheckNamespace
7
namespace Svg.ExCSS
Eric Domke's avatar
Eric Domke committed
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
{
    public class TermList : Term
    {
        private readonly List<GrammarSegment> _separator = new List<GrammarSegment>();
        private readonly List<Term> _items = new List<Term>();
        private const GrammarSegment DefaultSeparator = GrammarSegment.Comma;

        public TermList()
        {
        }

        public TermList(params Term[] terms)
        {
            for(var i = 0; i < terms.Length; ++i)
            {
                AddTerm(terms[i]);
                if(i != terms.Length-1)
                {
                    AddSeparator(DefaultSeparator);
                }
            }
        }

        public void AddTerm(Term term)
        {
            if (_items.Count != _separator.Count)
            {
                throw new NotSupportedException("Must call AddTerm AddSeparator in that order");
            }

            _items.Add(term);
        }

        public void AddSeparator(TermSeparator termSeparator)
        {
            switch(termSeparator)
            {
                case(TermSeparator.Comma):
                {
                    AddSeparator(GrammarSegment.Comma);
                    break;
                }
	             case(TermSeparator.Space):
                {
                    AddSeparator(GrammarSegment.Whitespace);
                    break;
                }
            }
        }

58
        internal void AddSeparator(GrammarSegment termSeparator)
Eric Domke's avatar
Eric Domke committed
59
60
61
62
63
64
        {
            if (_items.Count != _separator.Count + 1)
            {
                throw new NotSupportedException("Must call AddTerm AddSeparator in that order");
            }

65
            _separator.Add(termSeparator);
Eric Domke's avatar
Eric Domke committed
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
        }

        public int Length
        {
            get { return _items.Count; }
        }

        [IndexerName("ListItems")]
        public Term this [int index]
        {
            //return index >= 0 && index < _items.Count ? _items[index] : null; 
            get { return _items[index]; }
        }

        public Term Item(int index)
        {
            return this[index];
        }

        public override string ToString()
        {
            var builder = new StringBuilder();

            for (var i = 0; i < _items.Count; i++)
            {
                builder.Append(_items[i]);

                if (i == _separator.Count)
                    break;

                switch (_separator[i])
                {
                    case GrammarSegment.Whitespace:
                        builder.Append(" ");
                        break;

                    case GrammarSegment.Comma:
                        builder.Append(",");
                        break;

                    default:
                        throw new NotImplementedException();
                }
            }

            return builder.ToString();
        }

        /// <summary>
        /// exposed enumeration for the adding of separators into term lists
        /// </summary>
        public enum TermSeparator
        {
            Comma,
            Space
        }
122
123
124
125
126
127
128
129

        internal void SetLastTerm(Term term)
        {
            if (Length == 0)
                AddTerm(term);
            else
                _items[Length - 1] = term;
        }
Eric Domke's avatar
Eric Domke committed
130
131
    }
}