Пример #1
0
 internal void CheckIncludeRecursion(string href)
 {
     if (this.includedUris [href] != null)
     {
         // FIXME: fill line info
         throw new RelaxngException("Include recursion found. href: " + href);
     }
     if (parentGrammar != null)
     {
         parentGrammar.CheckIncludeRecursion(href);
     }
 }
Пример #2
0
		internal override RdpPattern Compile (RelaxngGrammar grammar)
		{
			grammar.CheckIncludeRecursion (Href);
			grammar.IncludedUris.Add (Href, Href);
			if (grammar.Resolver == null)
				throw new RelaxngException (this, "To compile 'include' element, XmlResolver is required.");
			Uri uri = grammar.Resolver.ResolveUri (BaseUri != String.Empty ? new Uri (BaseUri) : null, Href);
			RelaxngPattern p = ReadExternalResource (grammar, uri, ns);

			p.DataProvider = grammar.Provider;
			RdpPattern ret = p.Compile (grammar);

			grammar.IncludedUris.Remove (Href);

			return ret;

		}
Пример #3
0
        // compile into div
        internal RelaxngDiv Compile(RelaxngGrammar grammar)
        {
            grammar.CheckIncludeRecursion(Href);
            grammar.IncludedUris.Add(Href);
            if (grammar.Resolver == null)
            {
                throw new RelaxngException(this, "To compile 'include' element, XmlResolver is required.");
            }
            Uri baseUri = null;

            try {
                if (BaseUri != null && BaseUri != String.Empty)
                {
                    baseUri = new Uri(BaseUri);
                }
#if PORTABLE
            } catch {
                throw;
            }
#else
            } catch (UriFormatException) {
Пример #4
0
		// compile into div
		internal RelaxngDiv Compile (RelaxngGrammar grammar)
		{
			grammar.CheckIncludeRecursion (Href);
			grammar.IncludedUris.Add (Href, Href);
			if (grammar.Resolver == null)
				throw new RelaxngException (this, "To compile 'include' element, XmlResolver is required.");
			Uri baseUri = null;
			try {
				if (BaseUri != null && BaseUri != String.Empty)
					baseUri = new Uri (BaseUri);
			} catch (UriFormatException) {
				if (File.Exists (BaseUri))
					baseUri = new Uri (Path.GetFullPath (BaseUri));
			}
			Uri uri = grammar.Resolver.ResolveUri (baseUri, Href);

			RelaxngGrammar g = ReadExternalResource (grammar, uri, (ns != null && ns.Length != 0) || !grammar.IsSourceCompactSyntax ? ns : grammar.DefaultNamespace) as RelaxngGrammar;
			if (g == null)
				throw new RelaxngException (this, "Included syntax must start with \"grammar\" element.");
			g.DataProvider = grammar.Provider;
			g.IsSourceCompactSyntax = grammar.IsSourceCompactSyntax;

			// process recursive inclusions.
			foreach (RelaxngInclude inc in g.Includes)
				g.Divs.Add (inc.Compile (grammar));

			// process this own div children.
			// each div subelements are also compiled.
			foreach (RelaxngDiv cdiv in divs)
				cdiv.Compile (g);
			foreach (RelaxngDiv cdiv in g.Divs)
				cdiv.Compile (g);

			// replace redifinitions into div.
			// starts.
			if (this.Starts.Count > 0 && g.Starts.Count == 0)
				throw new RelaxngException (this, "When the included grammar does not contain start components, this include component must not contain start components.");
			RelaxngGrammarContentList appliedStarts = (this.starts.Count > 0) ?
				this.starts : g.Starts;

			RelaxngDiv div = new RelaxngDiv ();
			div.BaseUri = this.BaseUri;
			div.LinePosition = this.LinePosition;
			div.LineNumber = this.LineNumber;

			foreach (RelaxngStart start in appliedStarts)
				div.Starts.Add (start);

			// defines.
			Hashtable overrides = new Hashtable ();
			Hashtable originalDefs = new Hashtable ();
			foreach (RelaxngDefine def in defines) {
				overrides.Add (def.Name, def.Name);
				div.Defines.Add (def);
			}
			foreach (RelaxngDefine def in g.Defines) {
				originalDefs [def.Name] = def.Name;
				if (!overrides.ContainsKey (def.Name)) {
					div.Defines.Add (def);
				}
				// else discard.
			}

			foreach (string name in overrides.Values)
				if (!originalDefs.ContainsKey (name))
					throw new RelaxngException (this, "The include component must not contain define components whose name does not appear in the included grammar component.");

			grammar.IncludedUris.Remove (Href);
			return div;
		}
Пример #5
0
		internal override RdpPattern Compile (RelaxngGrammar grammar)
		{
			grammar.CheckIncludeRecursion (Href);
			grammar.IncludedUris.Add (Href, Href);
			if (grammar.Resolver == null)
				throw new RelaxngException (this, "To compile 'include' element, XmlResolver is required.");
			Uri uri = grammar.Resolver.ResolveUri (BaseUri != String.Empty ? new Uri (BaseUri) : null, Href);
			RelaxngPattern p = ReadExternalResource (grammar, uri, ns);

			p.DataProvider = grammar.Provider;
			RdpPattern ret = p.Compile (grammar);

			grammar.IncludedUris.Remove (Href);

			return ret;

		}
Пример #6
0
        // compile into div
        internal RelaxngDiv Compile(RelaxngGrammar grammar)
        {
            grammar.CheckIncludeRecursion(Href);
            grammar.IncludedUris.Add(Href, Href);
            if (grammar.Resolver == null)
            {
                throw new RelaxngException(this, "To compile 'include' element, XmlResolver is required.");
            }
            Uri baseUri = null;

            try {
                if (BaseUri != null && BaseUri != String.Empty)
                {
                    baseUri = new Uri(BaseUri);
                }
            } catch (UriFormatException) {
                if (File.Exists(BaseUri))
                {
                    baseUri = new Uri(Path.GetFullPath(BaseUri));
                }
            }
            Uri uri = grammar.Resolver.ResolveUri(baseUri, Href);

            RelaxngGrammar g = ReadExternalResource(grammar, uri, (ns != null && ns.Length != 0) || !grammar.IsSourceCompactSyntax ? ns : grammar.DefaultNamespace) as RelaxngGrammar;

            if (g == null)
            {
                throw new RelaxngException(this, "Included syntax must start with \"grammar\" element.");
            }
            g.DataProvider          = grammar.Provider;
            g.IsSourceCompactSyntax = grammar.IsSourceCompactSyntax;

            // process recursive inclusions.
            foreach (RelaxngInclude inc in g.Includes)
            {
                g.Divs.Add(inc.Compile(grammar));
            }

            // process this own div children.
            // each div subelements are also compiled.
            foreach (RelaxngDiv cdiv in divs)
            {
                cdiv.Compile(g);
            }
            foreach (RelaxngDiv cdiv in g.Divs)
            {
                cdiv.Compile(g);
            }

            // replace redifinitions into div.
            // starts.
            if (this.Starts.Count > 0 && g.Starts.Count == 0)
            {
                throw new RelaxngException(this, "When the included grammar does not contain start components, this include component must not contain start components.");
            }
            RelaxngGrammarContentList appliedStarts = (this.starts.Count > 0) ?
                                                      this.starts : g.Starts;

            RelaxngDiv div = new RelaxngDiv();

            div.BaseUri      = this.BaseUri;
            div.LinePosition = this.LinePosition;
            div.LineNumber   = this.LineNumber;

            foreach (RelaxngStart start in appliedStarts)
            {
                div.Starts.Add(start);
            }

            // defines.
            Hashtable overrides    = new Hashtable();
            Hashtable originalDefs = new Hashtable();

            foreach (RelaxngDefine def in defines)
            {
                overrides.Add(def.Name, def.Name);
                div.Defines.Add(def);
            }
            foreach (RelaxngDefine def in g.Defines)
            {
                originalDefs [def.Name] = def.Name;
                if (!overrides.ContainsKey(def.Name))
                {
                    div.Defines.Add(def);
                }
                // else discard.
            }

            foreach (string name in overrides.Values)
            {
                if (!originalDefs.ContainsKey(name))
                {
                    throw new RelaxngException(this, "The include component must not contain define components whose name does not appear in the included grammar component.");
                }
            }

            grammar.IncludedUris.Remove(Href);
            return(div);
        }