using System.IO;\r
using System.Xml;\r
using Commons.Xml.Relaxng.Derivative;\r
+using Commons.Xml.Relaxng.Rnc;\r
+\r
+#if NET_2_0\r
+using NSResolver = System.Xml.IXmlNamespaceResolver;\r
+#else\r
+using NSResolver = System.Xml.XmlNamespaceManager;\r
+#endif\r
\r
namespace Commons.Xml.Relaxng\r
{\r
set { baseUri = value; }\r
}\r
\r
- public abstract void Write (XmlWriter write);\r
+ public abstract void Write (XmlWriter writer);\r
+\r
+ internal abstract void WriteRnc (RncWriter writer);\r
}\r
\r
public abstract class RelaxngSingleContentPattern : RelaxngPattern\r
{\r
// Flatten patterns into RdpGroup. See 4.12.\r
if (patterns.Count == 0)\r
- throw new RelaxngException ("No pattern contents.");\r
+ throw new RelaxngException (this, "No pattern contents.");\r
RdpPattern p = ((RelaxngPattern) patterns [0]).Compile (g);\r
if (patterns.Count == 1)\r
return p;\r
{\r
// Flatten patterns. See 4.12.\r
if (patterns.Count == 0)\r
- throw new RelaxngException ("No pattern contents.");\r
+ throw new RelaxngException (this, "No pattern contents.");\r
\r
RdpPattern p = ((RelaxngPattern) patterns [0]).Compile (g);\r
if (patterns.Count == 1)\r
writer.WriteEndElement ();\r
}\r
\r
+ internal override void WriteRnc (RncWriter writer)\r
+ {\r
+ writer.WriteStart (this);\r
+ }\r
+\r
internal RdpPattern Compile (RelaxngGrammar grammar)\r
{\r
return p.Compile (grammar);\r
writer.WriteEndElement ();\r
}\r
\r
+ internal override void WriteRnc (RncWriter writer)\r
+ {\r
+ writer.WriteDefine (this);\r
+ }\r
+\r
internal RdpPattern Compile (RelaxngGrammar grammar)\r
{\r
return makeSingle (grammar);\r
{\r
// Flatten patterns into RdpGroup. See 4.12.\r
if (patterns.Count == 0)\r
- throw new RelaxngException ("No pattern contents.");\r
+ throw new RelaxngException (this, "No pattern contents.");\r
RdpPattern p = ((RelaxngPattern) patterns [0]).Compile (g);\r
if (patterns.Count == 1)\r
return p;\r
writer.WriteEndElement ();\r
}\r
\r
+ internal override void WriteRnc (RncWriter writer)\r
+ {\r
+ writer.WriteInclude (this);\r
+ }\r
+\r
// compile into div\r
internal RelaxngDiv Compile (RelaxngGrammar grammar)\r
{\r
grammar.CheckIncludeRecursion (Href);\r
grammar.IncludedUris.Add (Href, Href);\r
if (grammar.Resolver == null)\r
- throw new RelaxngException ("To compile 'include' element, XmlResolver is required.");\r
+ throw new RelaxngException (this, "To compile 'include' element, XmlResolver is required.");\r
Uri uri = grammar.Resolver.ResolveUri (BaseUri != String.Empty ? new Uri (BaseUri) : null, Href);\r
XmlTextReader xtr = null;\r
RelaxngGrammar g = null;\r
xtr.Close ();\r
}\r
if (g == null)\r
- throw new RelaxngException ("Included syntax must start with \"grammar\" element.");\r
+ throw new RelaxngException (this, "Included syntax must start with \"grammar\" element.");\r
g.DataProvider = grammar.Provider;\r
\r
// process recursive inclusions.\r
// replace redifinitions into div.\r
// starts.\r
if (this.Starts.Count > 0 && g.Starts.Count == 0)\r
- throw new RelaxngException ("When the included grammar does not contain start components, this include component must not contain start components.");\r
+ throw new RelaxngException (this, "When the included grammar does not contain start components, this include component must not contain start components.");\r
RelaxngGrammarContentList appliedStarts = (this.starts.Count > 0) ?\r
this.starts : g.Starts;\r
\r
div.Defines.Add (def);\r
}\r
foreach (RelaxngDefine def in g.Defines) {\r
- originalDefs.Add (def.Name, def.Name);\r
- if (overrides [def.Name] == null)\r
+ originalDefs [def.Name] = def.Name;\r
+ if (!overrides.ContainsKey (def.Name)) {\r
div.Defines.Add (def);\r
+ }\r
// else discard.\r
}\r
+\r
foreach (string name in overrides.Values)\r
- if (!originalDefs.Contains (name))\r
- throw new RelaxngException ("The include component must not contain define components whose name does not appear in the included grammar component.");\r
+ if (!originalDefs.ContainsKey (name))\r
+ throw new RelaxngException (this, "The include component must not contain define components whose name does not appear in the included grammar component.");\r
\r
grammar.IncludedUris.Remove (Href);\r
return div;\r
writer.WriteEndElement ();\r
}\r
\r
+ internal override void WriteRnc (RncWriter writer)\r
+ {\r
+ writer.WriteDiv (this);\r
+ }\r
+\r
internal void Compile (RelaxngGrammar grammar)\r
{\r
foreach (RelaxngDiv div in divs)\r
this.IsCompiled = true;\r
}\r
\r
+ public void WriteCompact (TextWriter writer)\r
+ {\r
+ WriteRnc (new RncWriter (writer));\r
+ }\r
+\r
+ public void WriteCompact (TextWriter writer, NSResolver res)\r
+ {\r
+ WriteRnc (new RncWriter (writer, res));\r
+ }\r
\r
// Internal\r
internal XmlResolver Resolver {\r
writer.WriteEndElement ();\r
}\r
\r
+ internal override void WriteRnc (RncWriter writer)\r
+ {\r
+ writer.WriteNotAllowed (this);\r
+ }\r
+\r
internal override RdpPattern Compile (RelaxngGrammar grammar)\r
{\r
return RdpNotAllowed.Instance;\r
writer.WriteEndElement ();\r
}\r
\r
+ internal override void WriteRnc (RncWriter writer)\r
+ {\r
+ writer.WriteEmpty (this);\r
+ }\r
+\r
internal override RdpPattern Compile (RelaxngGrammar grammar)\r
{\r
return RdpEmpty.Instance;\r
writer.WriteEndElement ();\r
}\r
\r
+ internal override void WriteRnc (RncWriter writer)\r
+ {\r
+ writer.WriteText (this);\r
+ }\r
+\r
internal override RdpPattern Compile (RelaxngGrammar grammar)\r
{\r
return RdpText.Instance;\r
writer.WriteEndElement ();\r
}\r
\r
+ internal override void WriteRnc (RncWriter writer)\r
+ {\r
+ writer.WriteData (this);\r
+ }\r
+\r
internal override RdpPattern Compile (RelaxngGrammar grammar)\r
{\r
// RdpParamList rdpl = new RdpParamList ();\r
RdpPattern p = null;\r
if (this.except != null) {\r
if (except.Patterns.Count == 0)\r
- throw new RelaxngException ("data except pattern have no children.");\r
+ throw new RelaxngException (this, "data except pattern have no children.");\r
p = except.Patterns [0].Compile (grammar);\r
for (int i=1; i<except.Patterns.Count; i++)\r
p = new RdpChoice (p,\r
writer.WriteEndElement ();\r
}\r
\r
+ internal override void WriteRnc (RncWriter writer)\r
+ {\r
+ writer.WriteValue (this);\r
+ }\r
+\r
internal override RdpPattern Compile (RelaxngGrammar grammar)\r
{\r
IsCompiled = true;\r
writer.WriteEndElement ();\r
}\r
\r
+ internal override void WriteRnc (RncWriter writer)\r
+ {\r
+ writer.WriteList (this);\r
+ }\r
+\r
internal override RdpPattern Compile (RelaxngGrammar grammar)\r
{\r
\r
writer.WriteEndElement ();\r
}\r
\r
+ internal override void WriteRnc (RncWriter writer)\r
+ {\r
+ writer.WriteElement (this);\r
+ }\r
+\r
internal override RdpPattern Compile (RelaxngGrammar grammar)\r
{\r
return new RdpElement (\r
writer.WriteEndElement ();\r
}\r
\r
+ internal override void WriteRnc (RncWriter writer)\r
+ {\r
+ writer.WriteAttribute (this);\r
+ }\r
+\r
private void checkInvalidAttrNameClass (RdpNameClass nc)\r
{\r
string xmlnsNS = "http://www.w3.org/2000/xmlns";\r
RdpName n = nc as RdpName;\r
if (n != null) {\r
if (n.NamespaceURI == xmlnsNS)\r
- throw new RelaxngException ("cannot specify \"" + xmlnsNS + "\" for name of attribute.");\r
+ throw new RelaxngException (this, "cannot specify \"" + xmlnsNS + "\" for name of attribute.");\r
if (n.LocalName == "xmlns" && n.NamespaceURI == "")\r
- throw new RelaxngException ("cannot specify \"xmlns\" inside empty ns context.");\r
+ throw new RelaxngException (this, "cannot specify \"xmlns\" inside empty ns context.");\r
} else {\r
RdpNsName nn = nc as RdpNsName;\r
if (nn.NamespaceURI == "http://www.w3.org/2000/xmlns")\r
- throw new RelaxngException ("cannot specify \"" + xmlnsNS + "\" for name of attribute.");\r
+ throw new RelaxngException (this, "cannot specify \"" + xmlnsNS + "\" for name of attribute.");\r
RdpNsNameExcept x = nc as RdpNsNameExcept;\r
if (x != null)\r
checkInvalidAttrNameClass (x.ExceptNameClass);\r
\r
public override bool Nullable {\r
get {\r
- throw new InvalidOperationException ();\r
+ throw new InvalidOperationException ("Internal error: should not reach.");\r
}\r
}\r
\r
+ public override void GetLabels (Hashtable elements, Hashtable attributes)\r
+ {\r
+ throw new InvalidOperationException ("Internal error: should not reach.");\r
+ }\r
+\r
internal override RdpPattern ExpandRef (Hashtable defs)\r
{\r
return referencedPattern.ExpandRef (defs);\r
writer.WriteEndElement ();\r
}\r
\r
+ internal override void WriteRnc (RncWriter writer)\r
+ {\r
+ writer.WriteRef (this);\r
+ }\r
+\r
internal override RdpPattern Compile (RelaxngGrammar grammar)\r
{\r
// Important!! This compile method only generates stub.\r
writer.WriteEndElement ();\r
}\r
\r
+ internal override void WriteRnc (RncWriter writer)\r
+ {\r
+ writer.WriteParentRef (this);\r
+ }\r
+\r
internal override RdpPattern Compile (RelaxngGrammar grammar)\r
{\r
IsCompiled = false;\r
writer.WriteEndElement ();\r
}\r
\r
+ internal override void WriteRnc (RncWriter writer)\r
+ {\r
+ writer.WriteExternalRef (this);\r
+ }\r
+\r
internal override RdpPattern Compile (RelaxngGrammar grammar)\r
{\r
grammar.CheckIncludeRecursion (Href);\r
grammar.IncludedUris.Add (Href, Href);\r
if (grammar.Resolver == null)\r
- throw new RelaxngException ("To compile 'include' element, XmlResolver is required.");\r
+ throw new RelaxngException (this, "To compile 'include' element, XmlResolver is required.");\r
Uri uri = grammar.Resolver.ResolveUri (BaseUri != String.Empty ? new Uri (BaseUri) : null, Href);\r
XmlTextReader xtr = null;\r
try {\r
writer.WriteEndElement ();\r
}\r
\r
+ internal override void WriteRnc (RncWriter writer)\r
+ {\r
+ writer.WriteOneOrMore (this);\r
+ }\r
+\r
internal override RdpPattern Compile (RelaxngGrammar grammar)\r
{\r
IsCompiled = true;\r
writer.WriteEndElement ();\r
}\r
\r
+ internal override void WriteRnc (RncWriter writer)\r
+ {\r
+ writer.WriteZeroOrMore (this);\r
+ }\r
+\r
internal override RdpPattern Compile (RelaxngGrammar grammar)\r
{\r
IsCompiled = true;\r
writer.WriteEndElement ();\r
}\r
\r
+ internal override void WriteRnc (RncWriter writer)\r
+ {\r
+ writer.WriteOptional (this);\r
+ }\r
+\r
internal override RdpPattern Compile (RelaxngGrammar grammar)\r
{\r
IsCompiled = true;\r
writer.WriteEndElement ();\r
}\r
\r
+ internal override void WriteRnc (RncWriter writer)\r
+ {\r
+ writer.WriteMixed (this);\r
+ }\r
+\r
internal override RdpPattern Compile (RelaxngGrammar grammar)\r
{\r
IsCompiled = true;\r
writer.WriteEndElement ();\r
}\r
\r
+ internal override void WriteRnc (RncWriter writer)\r
+ {\r
+ writer.WriteChoice (this);\r
+ }\r
+\r
internal override RdpPattern Compile (RelaxngGrammar grammar)\r
{\r
IsCompiled = true;\r
writer.WriteEndElement ();\r
}\r
\r
+ internal override void WriteRnc (RncWriter writer)\r
+ {\r
+ writer.WriteGroup (this);\r
+ }\r
+\r
internal override RdpPattern Compile (RelaxngGrammar grammar)\r
{\r
IsCompiled = true;\r
writer.WriteEndElement ();\r
}\r
\r
+ internal override void WriteRnc (RncWriter writer)\r
+ {\r
+ writer.WriteInterleave (this);\r
+ }\r
+\r
internal override RdpPattern Compile (RelaxngGrammar grammar)\r
{\r
IsCompiled = true;\r
writer.WriteEndElement ();\r
}\r
\r
+ internal override void WriteRnc (RncWriter writer)\r
+ {\r
+ writer.WriteParam (this);\r
+ }\r
+\r
internal RdpParam Compile (RelaxngGrammar grammar)\r
{\r
IsCompiled = true;\r
p.Write (writer);\r
writer.WriteEndElement ();\r
}\r
+\r
+ internal override void WriteRnc (RncWriter writer)\r
+ {\r
+ writer.WriteDataExcept (this);\r
+ }\r
}\r
\r
internal class RelaxngRefPattern\r