summaryrefslogtreecommitdiffstats
path: root/tools/Sandcastle/Source/BuildAssembler/BuildAssemblerLibrary/BuildContext.cs
diff options
context:
space:
mode:
Diffstat (limited to 'tools/Sandcastle/Source/BuildAssembler/BuildAssemblerLibrary/BuildContext.cs')
-rw-r--r--tools/Sandcastle/Source/BuildAssembler/BuildAssemblerLibrary/BuildContext.cs173
1 files changed, 173 insertions, 0 deletions
diff --git a/tools/Sandcastle/Source/BuildAssembler/BuildAssemblerLibrary/BuildContext.cs b/tools/Sandcastle/Source/BuildAssembler/BuildAssemblerLibrary/BuildContext.cs
new file mode 100644
index 0000000..02bed62
--- /dev/null
+++ b/tools/Sandcastle/Source/BuildAssembler/BuildAssemblerLibrary/BuildContext.cs
@@ -0,0 +1,173 @@
+// Copyright (c) Microsoft Corporation. All rights reserved.
+//
+using System;
+using System.Collections.Generic;
+using System.Xml;
+using System.Xml.XPath;
+using System.Xml.Xsl;
+
+namespace Microsoft.Ddue.Tools {
+
+ public class BuildContext {
+
+ private CustomContext context = new CustomContext();
+
+ // Namespace control
+
+ public void AddNamespace (string prefix, string uri) {
+ context.AddNamespace(prefix, uri);
+ }
+
+ public string LookupNamespace (string prefix) {
+ return( context.LookupNamespace(prefix) );
+ }
+
+ public bool RemoveNamespace (string prefix) {
+ string uri = LookupNamespace(prefix);
+ if (uri == null) {
+ return(false);
+ } else {
+ context.RemoveNamespace(prefix, uri);
+ return(true);
+ }
+ }
+
+ public void ClearNamespaces () {
+ }
+
+ // Variable control
+
+ public void AddVariable (string name, string value) {
+ context[name] = value;
+ }
+
+ public string LookupVariable (string name) {
+ return( context[name] );
+ }
+
+ public bool RemoveVariable (string name) {
+ return( context.ClearVariable(name) );
+ }
+
+ public void ClearVariables () {
+ context.ClearVariables();
+ }
+
+ public string this [string name] {
+ get {
+ return(context[name]);
+ }
+ set {
+ context[name] = value;
+ }
+ }
+
+ // Function control
+
+ // The context for use in XPath queries
+
+ public XsltContext XsltContext {
+ get {
+ return(context);
+ }
+ }
+
+ // Load data from config
+
+ public void Load (XPathNavigator configuration) {
+ XPathNodeIterator namespaceNodes = configuration.Select("namespace");
+ foreach (XPathNavigator namespaceNode in namespaceNodes) {
+ string prefixValue = namespaceNode.GetAttribute("prefix", String.Empty);
+ string uriValue = namespaceNode.GetAttribute("uri", String.Empty);
+ AddNamespace(prefixValue, uriValue);
+ }
+ }
+
+ }
+
+ public class CustomContext : XsltContext {
+
+ public CustomContext() : base() {}
+
+ // variable control
+
+ private Dictionary<string, IXsltContextVariable> variables = new Dictionary<string,IXsltContextVariable>();
+
+ public string this [string variable] {
+ get {
+ return(variables[variable].Evaluate(this).ToString());
+ }
+ set {
+ variables[variable] = new CustomVariable(value);
+ }
+ }
+
+ public bool ClearVariable (string name) {
+ return( variables.Remove(name) );
+ }
+
+ public void ClearVariables () {
+ variables.Clear();
+ }
+
+ // Implementation of XsltContext methods
+
+ public override IXsltContextVariable ResolveVariable (string prefix, string name) {
+ return( variables[name] );
+ }
+
+ public override IXsltContextFunction ResolveFunction (string prefix, string name, XPathResultType[] argumentTypes) {
+ throw new NotImplementedException();
+ }
+
+ public override int CompareDocument (string baseUri, string nextBaseUri) {
+ return(0);
+ }
+
+ public override bool Whitespace {
+ get {
+ return(true);
+ }
+ }
+
+ public override bool PreserveWhitespace (XPathNavigator node) {
+ return(true);
+ }
+
+ }
+
+
+ internal struct CustomVariable : IXsltContextVariable {
+
+ public CustomVariable (string value) {
+ this.value = value;
+ }
+
+ private string value;
+
+ public bool IsLocal {
+ get {
+ return(false);
+ }
+ }
+
+ public bool IsParam {
+ get {
+ return(false);
+ }
+ }
+
+ public XPathResultType VariableType {
+ get {
+ return(XPathResultType.String);
+ }
+ }
+
+ public Object Evaluate (XsltContext context) {
+ return(value);
+ }
+
+ }
+
+
+} \ No newline at end of file