2 // Commons.Xml.Relaxng.RelaxngNameClass.cs
\r
5 // Atsushi Enomoto <ginga@kit.hi-ho.ne.jp>
\r
7 // 2003 Atsushi Enomoto "No rights reserved."
\r
11 using System.Collections;
\r
15 using Commons.Xml.Relaxng.Derivative;
\r
17 namespace Commons.Xml.Relaxng
\r
19 public class RelaxngNameClassList : CollectionBase
\r
21 public RelaxngNameClassList ()
\r
25 public void Add (RelaxngNameClass p)
\r
30 public RelaxngNameClass this [int i] {
\r
31 get { return this.List [i] as RelaxngNameClass; }
\r
32 set { this.List [i] = value; }
\r
35 public void Insert (int pos, RelaxngNameClass p)
\r
37 List.Insert (pos, p);
\r
40 public void Remove (RelaxngNameClass p)
\r
46 public abstract class RelaxngNameClass : RelaxngElementBase
\r
48 protected RelaxngNameClass ()
\r
52 internal abstract RdpNameClass Compile (RelaxngGrammar g);
\r
54 internal abstract void CheckConstraints (bool rejectAnyName, bool rejectNsName);
\r
56 internal bool FindInvalidType (RdpNameClass nc, bool allowNsName)
\r
58 RdpNameClassChoice choice = nc as RdpNameClassChoice;
\r
60 return FindInvalidType (choice.LValue, allowNsName)
\r
61 || FindInvalidType (choice.RValue, allowNsName);
\r
62 else if (nc is RdpAnyName)
\r
64 else if (nc is RdpNsName && !allowNsName)
\r
71 public class RelaxngAnyName : RelaxngNameClass
\r
73 RelaxngExceptNameClass except;
\r
74 public RelaxngAnyName ()
\r
78 public RelaxngExceptNameClass Except {
\r
79 get { return except; }
\r
80 set { except = value; }
\r
83 public override void Write (XmlWriter writer)
\r
85 writer.WriteStartElement ("", "anyName", RelaxngGrammar.NamespaceURI);
\r
87 except.Write (writer);
\r
88 writer.WriteEndElement ();
\r
91 internal override RdpNameClass Compile (RelaxngGrammar g)
\r
93 if (except != null) {
\r
94 RdpNameClass exc = except.Compile (g);
\r
95 if (FindInvalidType (exc, true))
\r
96 throw new RelaxngException ("anyName except cannot have anyName children.");
\r
97 return new RdpAnyNameExcept (exc);
\r
99 return RdpAnyName.Instance;
\r
102 internal override void CheckConstraints (bool rejectAnyName, bool rejectNsName)
\r
105 throw new RelaxngException ("Not allowed anyName was found.");
\r
106 if (except != null)
\r
107 foreach (RelaxngNameClass nc in except.Names)
\r
108 nc.CheckConstraints (true, rejectNsName);
\r
113 public class RelaxngNsName : RelaxngNameClass
\r
116 RelaxngExceptNameClass except;
\r
117 public RelaxngNsName ()
\r
121 public string Namespace {
\r
123 set { ns = value; }
\r
126 public RelaxngExceptNameClass Except {
\r
127 get { return except; }
\r
128 set { except = value; }
\r
131 public override void Write (XmlWriter writer)
\r
133 writer.WriteStartElement ("", "nsName", RelaxngGrammar.NamespaceURI);
\r
134 if (except != null)
\r
135 except.Write (writer);
\r
136 writer.WriteEndElement ();
\r
139 internal override RdpNameClass Compile (RelaxngGrammar g)
\r
141 if (except != null) {
\r
142 RdpNameClass exc = except.Compile (g);
\r
143 if (FindInvalidType (exc, false))
\r
144 throw new RelaxngException ("nsName except cannot have anyName nor nsName children.");
\r
145 return new RdpNsNameExcept (ns, exc);
\r
147 return new RdpNsName (ns);
\r
151 internal override void CheckConstraints (bool rejectAnyName, bool rejectNsName)
\r
154 throw new RelaxngException ("Not allowed nsName was found.");
\r
155 if (except != null)
\r
156 foreach (RelaxngNameClass nc in except.Names)
\r
157 nc.CheckConstraints (true, true);
\r
162 public class RelaxngName : RelaxngNameClass
\r
167 public RelaxngName ()
\r
171 public RelaxngName (string ncname, string ns)
\r
173 XmlConvert.VerifyNCName (ncname);
\r
174 this.ncname = ncname;
\r
178 public string LocalName {
\r
179 get { return ncname; }
\r
181 XmlConvert.VerifyNCName (value);
\r
186 public string Namespace {
\r
188 set { ns = value; }
\r
191 public override void Write (XmlWriter writer)
\r
193 writer.WriteStartElement ("", "name", RelaxngGrammar.NamespaceURI);
\r
194 writer.WriteAttributeString ("ns", ns);
\r
195 // Here we just skip qname
\r
196 writer.WriteString (ncname);
\r
197 writer.WriteEndElement ();
\r
200 internal override RdpNameClass Compile (RelaxngGrammar g)
\r
202 return new RdpName (ncname, ns);
\r
205 internal override void CheckConstraints (bool rejectAnyName, bool rejectNsName)
\r
211 public class RelaxngNameChoice : RelaxngNameClass
\r
213 RelaxngNameClassList names = new RelaxngNameClassList ();
\r
215 public RelaxngNameChoice ()
\r
219 public RelaxngNameClassList Children {
\r
220 get { return names; }
\r
221 set { names = value; }
\r
224 public override void Write (XmlWriter writer)
\r
226 writer.WriteStartElement ("", "choice", RelaxngGrammar.NamespaceURI);
\r
227 foreach (RelaxngNameClass nc in Children)
\r
229 writer.WriteEndElement ();
\r
232 internal override RdpNameClass Compile (RelaxngGrammar g)
\r
234 // Flatten names into RdpChoice. See 4.12.
\r
235 if (names.Count == 0)
\r
237 RdpNameClass p = ((RelaxngNameClass) names [0]).Compile (g);
\r
238 if (names.Count == 1)
\r
241 for (int i=1; i<names.Count; i++)
\r
242 p = new RdpNameClassChoice (p, ((RelaxngNameClass) names [i]).Compile (g));
\r
246 internal override void CheckConstraints (bool rejectAnyName, bool rejectNsName)
\r
248 foreach (RelaxngNameClass nc in names)
\r
249 nc.CheckConstraints (rejectAnyName, rejectNsName);
\r
253 public class RelaxngExceptNameClass : RelaxngElementBase
\r
255 RelaxngNameClassList names = new RelaxngNameClassList ();
\r
257 public RelaxngExceptNameClass ()
\r
261 public RelaxngNameClassList Names {
\r
262 get { return names; }
\r
265 public override void Write (XmlWriter writer)
\r
267 writer.WriteStartElement ("", "except", RelaxngGrammar.NamespaceURI);
\r
268 foreach (RelaxngNameClass nc in Names)
\r
270 writer.WriteEndElement ();
\r
273 internal RdpNameClass Compile (RelaxngGrammar g)
\r
275 // Flatten names into RdpGroup. See 4.12.
\r
276 if (names.Count == 0)
\r
278 RdpNameClass p = ((RelaxngNameClass) names [0]).Compile (g);
\r
279 for (int i=1; i<names.Count; i++) {
\r
280 p = new RdpNameClassChoice (
\r
281 ((RelaxngNameClass) names [i]).Compile (g),
\r