summaryrefslogtreecommitdiffstats
path: root/tools/Sandcastle/Source/BuildAssembler/SyntaxComponents/AspNetSyntax.cs
diff options
context:
space:
mode:
Diffstat (limited to 'tools/Sandcastle/Source/BuildAssembler/SyntaxComponents/AspNetSyntax.cs')
-rw-r--r--tools/Sandcastle/Source/BuildAssembler/SyntaxComponents/AspNetSyntax.cs210
1 files changed, 210 insertions, 0 deletions
diff --git a/tools/Sandcastle/Source/BuildAssembler/SyntaxComponents/AspNetSyntax.cs b/tools/Sandcastle/Source/BuildAssembler/SyntaxComponents/AspNetSyntax.cs
new file mode 100644
index 0000000..8f25f1b
--- /dev/null
+++ b/tools/Sandcastle/Source/BuildAssembler/SyntaxComponents/AspNetSyntax.cs
@@ -0,0 +1,210 @@
+// Copyright © Microsoft Corporation.
+// This source file is subject to the Microsoft Permissive License.
+// See http://www.microsoft.com/resources/sharedsource/licensingbasics/sharedsourcelicenses.mspx.
+// All other rights reserved.
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Xml.XPath;
+
+namespace Microsoft.Ddue.Tools {
+
+
+ public class AspNetSyntaxGenerator : SyntaxGenerator {
+
+ public AspNetSyntaxGenerator (XPathNavigator configuration) : base(configuration) {
+ }
+
+ protected static XPathExpression nameExpression = XPathExpression.Compile("string(apidata/@name)");
+ protected static XPathExpression groupExpression = XPathExpression.Compile("string(apidata/@group)");
+ protected static XPathExpression subgroupExpression = XPathExpression.Compile("string(apidata/@subgroup)");
+
+ protected static XPathExpression containingTypeExpression = XPathExpression.Compile("containers/type");
+ protected static XPathExpression declaringTypeExpression = XPathExpression.Compile("string(containers/type/@api)");
+ protected static XPathExpression propertyTypeExpression = XPathExpression.Compile("string(returns/type/@api)");
+ protected static XPathExpression propertyIsSettable = XPathExpression.Compile("boolean(propertydata/@set='true')");
+ protected static XPathExpression eventHandlerTypeExpression = XPathExpression.Compile("string(eventhandler/type/@api)");
+
+ protected static XPathExpression typeIsWebControl = XPathExpression.Compile("boolean(family/ancestors/type[@api='T:System.Web.UI.Control'])");
+
+ protected static XPathExpression propertyIsInnerProperty = XPathExpression.Compile("boolean(attributes/attribute[type/@api='T:System.Web.UI.PersistenceModeAttribute' and argument/enumValue/field/@name='InnerProperty'])");
+
+ protected static XPathExpression containingNamespaceExpression = XPathExpression.Compile("string(containers/namespace/@api)");
+
+ private string language = "AspNet";
+
+ public string Language {
+ get {
+ return (language);
+ }
+ }
+
+ public override void WriteSyntax (XPathNavigator reflection, SyntaxWriter writer) {
+
+ string group = (string)reflection.Evaluate(groupExpression);
+ string subgroup = (string)reflection.Evaluate(subgroupExpression);
+
+ if (group == "type" && subgroup == "class") {
+ string prefix = WebControlPrefix(reflection);
+ if (!String.IsNullOrEmpty(prefix)) {
+ WriteClassSyntax(reflection, writer, prefix);
+ }
+ }
+
+ if (group == "member") {
+
+ string prefix = null;
+ XPathNavigator containingType = reflection.SelectSingleNode(containingTypeExpression);
+ if (containingType != null) prefix = WebControlPrefix(containingType);
+
+ if (!String.IsNullOrEmpty(prefix)) {
+ if (subgroup == "property") {
+ WritePropertySyntax(reflection, writer, prefix);
+ } else if (subgroup == "event") {
+ WriteEventSyntax(reflection, writer, prefix);
+ }
+ }
+ }
+
+
+ }
+
+ private string WebControlPrefix (XPathNavigator reflection) {
+ if ((bool)reflection.Evaluate(typeIsWebControl)) {
+ string name = (string)reflection.Evaluate(nameExpression);
+ string space = (string)reflection.Evaluate(containingNamespaceExpression);
+ if ((space == "N:System.Web.UI") && ((name == "Page") || (name == "ScriptControl") || (name == "UserControl"))) {
+ return (null);
+ } else {
+ if (space == "N:System.Web.UI.MobileControls") {
+ return ("mobile");
+ } else {
+ return ("asp");
+ }
+ }
+ } else {
+ return (null);
+ }
+ }
+
+ private void WriteClassSyntax (XPathNavigator reflection, SyntaxWriter writer, string prefix) {
+
+ string name = (string)reflection.Evaluate(nameExpression);
+
+ writer.WriteStartBlock(Language);
+
+ writer.WriteString("<");
+ writer.WriteString(prefix);
+ writer.WriteString(":");
+ writer.WriteString(name);
+ writer.WriteString(" />");
+
+ writer.WriteEndBlock();
+
+ }
+
+ private void WritePropertySyntax (XPathNavigator reflection, SyntaxWriter writer, string prefix) {
+
+ bool set = (bool) reflection.Evaluate(propertyIsSettable);
+ if (!set) return;
+
+ string name = (string) reflection.Evaluate(nameExpression);
+ string declaringType = (string) reflection.Evaluate(declaringTypeExpression);
+ string propertyType = (string) reflection.Evaluate(propertyTypeExpression);
+
+ bool isInnerProperty = (bool)reflection.Evaluate(propertyIsInnerProperty);
+
+ writer.WriteStartBlock(Language);
+
+ if (isInnerProperty) {
+
+ // inner property logic
+
+ writer.WriteString("<");
+ writer.WriteString(prefix);
+ writer.WriteString(":");
+ writer.WriteReferenceLink(declaringType);
+ writer.WriteString(">");
+
+ writer.WriteLine();
+ writer.WriteString("\t");
+
+ writer.WriteString("<");
+ writer.WriteString(name);
+ writer.WriteString(">");
+ if (String.IsNullOrEmpty(propertyType)) {
+ writer.WriteParameter("value");
+ } else {
+ if (propertyType == "T:System.Boolean") {
+ writer.WriteString("True|False");
+ } else {
+ writer.WriteReferenceLink(propertyType);
+ }
+ }
+ writer.WriteString("</");
+ writer.WriteString(name);
+ writer.WriteString(">");
+
+ writer.WriteLine();
+
+ writer.WriteString("</");
+ writer.WriteString(prefix);
+ writer.WriteString(":");
+ writer.WriteReferenceLink(declaringType);
+ writer.WriteString(">");
+
+ } else {
+
+ // normal property logic
+
+ writer.WriteString("<");
+ writer.WriteString(prefix);
+ writer.WriteString(":");
+ writer.WriteReferenceLink(declaringType);
+ writer.WriteString(" ");
+ writer.WriteString(name);
+ writer.WriteString("=\"");
+ if (String.IsNullOrEmpty(propertyType)) {
+ writer.WriteParameter("value");
+ } else {
+ if (propertyType == "T:System.Boolean") {
+ writer.WriteString("True|False");
+ } else {
+ writer.WriteReferenceLink(propertyType);
+ }
+ }
+ writer.WriteString("\" />");
+
+ }
+
+ writer.WriteEndBlock();
+
+ }
+
+ private void WriteEventSyntax (XPathNavigator reflection, SyntaxWriter writer, string prefix) {
+
+ string name = (string)reflection.Evaluate(nameExpression);
+ string declaringType = (string)reflection.Evaluate(declaringTypeExpression);
+ string handlerType = (string)reflection.Evaluate(eventHandlerTypeExpression);
+
+ writer.WriteStartBlock(Language);
+
+ writer.WriteString("<");
+ writer.WriteString(prefix);
+ writer.WriteString(":");
+ writer.WriteReferenceLink(declaringType);
+ writer.WriteString(" ");
+ writer.WriteString("On");
+ writer.WriteString(name);
+ writer.WriteString("=\"");
+ writer.WriteReferenceLink(handlerType);
+ writer.WriteString("\" />");
+
+ writer.WriteEndBlock();
+
+ }
+
+ }
+
+}