From 5aa36a3b401a2dbf0887d1a795c7214938182df5 Mon Sep 17 00:00:00 2001 From: dgis Date: Fri, 10 Feb 2017 18:14:01 +0100 Subject: [PATCH] - Add multi-(language) documentation (https://github.com/dgis/xsddiagram/issues/8). - Fix the URL escaping in the import (https://github.com/dgis/xsddiagram/issues/11). - Add the attributes of an element with the option -a for text output only. --- MainForm.cs | 373 ++------------------ Options.cs | 6 + Program.cs | 12 +- ReadMe.txt | 14 +- XSDDiagram.exe | Bin 683008 -> 685056 bytes XSDDiagramConsole.exe | Bin 5120 -> 5120 bytes XSDDiagrams/DiagramHelpers.cs | 368 +++++++++++++++++++ XSDDiagrams/Parsing/Schema.cs | 4 +- XSDDiagrams/Rendering/Diagram.cs | 2 +- XSDDiagrams/Rendering/DiagramExporter.cs | 28 +- XSDDiagrams/Rendering/DiagramItem.cs | 44 +-- XSDDiagrams/Rendering/DiagramTxtRenderer.cs | 79 ++++- XSDDiagrams/XSDDiagrams2010.csproj | 1 + test.bat | 2 +- 14 files changed, 545 insertions(+), 388 deletions(-) create mode 100644 XSDDiagrams/DiagramHelpers.cs diff --git a/MainForm.cs b/MainForm.cs index c23e62a..c7701bb 100644 --- a/MainForm.cs +++ b/MainForm.cs @@ -636,70 +636,8 @@ namespace XSDDiagram ShowEnumerate(annotated); // Attributes enumeration - List listAttributes = new List(); - if (annotated is XMLSchema.element) - { - XMLSchema.element element = annotated as XMLSchema.element; + List listAttributes = DiagramHelpers.GetAnnotatedAttributes(this.schema, annotated, nameSpace); - if (element.Item is XMLSchema.complexType) - { - XMLSchema.complexType complexType = element.Item as XMLSchema.complexType; - listAttributes.AddRange(ShowAttributes(complexType, nameSpace)); - } - else if (element.type != null) - { - //XSDObject xsdObject = this.schema.ElementsByName[QualifiedNameToFullName("type", element.type)] as XSDObject; - //if (xsdObject != null) - XSDObject xsdObject; - if (this.schema.ElementsByName.TryGetValue(QualifiedNameToFullName("type", element.type), out xsdObject) && xsdObject != null) - { - XMLSchema.annotated annotatedElement = xsdObject.Tag as XMLSchema.annotated; - if (annotatedElement is XMLSchema.complexType) - { - XMLSchema.complexType complexType = annotatedElement as XMLSchema.complexType; - listAttributes.AddRange(ShowAttributes(complexType, nameSpace)); - } - else - { - } - } - else - { - } - } - else - { - } - } - else if (annotated is XMLSchema.complexType) - { - XMLSchema.complexType complexType = annotated as XMLSchema.complexType; - listAttributes.AddRange(ShowAttributes(complexType, nameSpace)); - } - //RC++ Original code - //else - //{ - //} - - //this.listViewAttributes.Items.Clear(); - //foreach (XSDAttribute attribute in listAttributes) - // this.listViewAttributes.Items.Add(new ListViewItem(new string[] { attribute.Name, attribute.Type, attribute.Use, attribute.DefaultValue })).Tag = attribute; - //RC-- - - //Adrian++ - //This part i modify - else if (annotated is XMLSchema.simpleType) - { - XMLSchema.attribute attr = new XMLSchema.attribute(); - XMLSchema.localSimpleType def = new XMLSchema.localSimpleType(); - def.Item = (annotated as XMLSchema.simpleType).Item; - attr.simpleType = def; - string type = ""; - if (def.Item is XMLSchema.restriction) type = (def.Item as XMLSchema.restriction).@base.Name; - XSDAttribute XSDattr = new XSDAttribute("filename", (annotated as XMLSchema.simpleType).name, "namespace", type, false, "", "", attr); - listAttributes.Add(XSDattr); - - } //This part i modify this.listViewAttributes.Items.Clear(); listAttributes.Reverse(); @@ -725,245 +663,6 @@ namespace XSDDiagram } } - private List ShowAttributes(XMLSchema.complexType complexType, string nameSpace) - { - List listAttributes = new List(); - ParseComplexTypeAttributes(nameSpace, listAttributes, complexType, false); - return listAttributes; - } - - private void ParseComplexTypeAttributes(string nameSpace, List listAttributes, XMLSchema.complexType complexType, bool isRestriction) - { - if (complexType.ItemsElementName != null) - { - for (int i = 0; i < complexType.ItemsElementName.Length; i++) - { - switch (complexType.ItemsElementName[i]) - { - case XMLSchema.ItemsChoiceType4.attribute: - { - XMLSchema.attribute attribute = complexType.Items[i] as XMLSchema.attribute; - ParseAttribute(nameSpace, listAttributes, attribute, false); - } - break; - case XMLSchema.ItemsChoiceType4.attributeGroup: - { - XMLSchema.attributeGroup attributeGroup = complexType.Items[i] as XMLSchema.attributeGroup; - ParseAttributeGroup(nameSpace, listAttributes, attributeGroup, false); - } - break; - case XMLSchema.ItemsChoiceType4.anyAttribute: - XMLSchema.wildcard wildcard = complexType.Items[i] as XMLSchema.wildcard; - XSDAttribute xsdAttribute = new XSDAttribute("", "*", wildcard.@namespace, "", false, null, null, null); - listAttributes.Add(xsdAttribute); - break; - case XMLSchema.ItemsChoiceType4.simpleContent: - case XMLSchema.ItemsChoiceType4.complexContent: - XMLSchema.annotated annotatedContent = null; - if (complexType.Items[i] is XMLSchema.complexContent) - { - XMLSchema.complexContent complexContent = complexType.Items[i] as XMLSchema.complexContent; - annotatedContent = complexContent.Item; - } - else if (complexType.Items[i] is XMLSchema.simpleContent) - { - XMLSchema.simpleContent simpleContent = complexType.Items[i] as XMLSchema.simpleContent; - annotatedContent = simpleContent.Item; - } - if (annotatedContent is XMLSchema.extensionType) - { - XMLSchema.extensionType extensionType = annotatedContent as XMLSchema.extensionType; - //XSDObject xsdExtensionType = this.schema.ElementsByName[QualifiedNameToFullName("type", extensionType.@base)] as XSDObject; - //if (xsdExtensionType != null) - XSDObject xsdExtensionType; - if (this.schema.ElementsByName.TryGetValue(QualifiedNameToFullName("type", extensionType.@base), out xsdExtensionType) && xsdExtensionType != null) - { - XMLSchema.annotated annotatedExtension = xsdExtensionType.Tag as XMLSchema.annotated; - if (annotatedExtension != null) - { - if (annotatedExtension is XMLSchema.complexType) - ParseComplexTypeAttributes(extensionType.@base.Namespace, listAttributes, annotatedExtension as XMLSchema.complexType, false); - } - } - if (extensionType.Items != null) - { - foreach (XMLSchema.annotated annotated in extensionType.Items) - { - if (annotated is XMLSchema.attribute) - { - ParseAttribute(nameSpace, listAttributes, annotated as XMLSchema.attribute, false); - } - else if (annotated is XMLSchema.attributeGroup) - { - ParseAttributeGroup(nameSpace, listAttributes, annotated as XMLSchema.attributeGroup, false); - } - } - } - } - else if (annotatedContent is XMLSchema.restrictionType) - { - XMLSchema.restrictionType restrictionType = annotatedContent as XMLSchema.restrictionType; - //XSDObject xsdRestrictionType = this.schema.ElementsByName[QualifiedNameToFullName("type", restrictionType.@base)] as XSDObject; - //if (xsdRestrictionType != null) - XSDObject xsdRestrictionType; - if (this.schema.ElementsByName.TryGetValue(QualifiedNameToFullName("type", restrictionType.@base), out xsdRestrictionType) && xsdRestrictionType != null) - { - XMLSchema.annotated annotatedRestriction = xsdRestrictionType.Tag as XMLSchema.annotated; - if (annotatedRestriction != null) - { - if (annotatedRestriction is XMLSchema.complexType) - ParseComplexTypeAttributes(restrictionType.@base.Namespace, listAttributes, annotatedRestriction as XMLSchema.complexType, false); - } - } - if (restrictionType.Items1 != null) - { - foreach (XMLSchema.annotated annotated in restrictionType.Items1) - { - if (annotated is XMLSchema.attribute) - { - ParseAttribute(nameSpace, listAttributes, annotated as XMLSchema.attribute, true); - } - else if (annotated is XMLSchema.attributeGroup) - { - ParseAttributeGroup(nameSpace, listAttributes, annotated as XMLSchema.attributeGroup, true); - } - } - } - } - break; - } - } - } - else - { - } - } - - private XSDAttribute ParseAttribute(string nameSpace, List listAttributes, XMLSchema.attribute attribute, bool isRestriction) - { - bool isReference = false; - string filename = ""; - string name = attribute.name; - string type = ""; - if (attribute.@ref != null) - { - object o = null; - this.schema.AttributesByName.TryGetValue(QualifiedNameToFullName("attribute", attribute.@ref), out o); - if (o is XSDAttribute) - { - XSDAttribute xsdAttributeInstance = o as XSDAttribute; - XSDAttribute refXSDAttribute = ParseAttribute(nameSpace, listAttributes, xsdAttributeInstance.Tag, isRestriction); - if(refXSDAttribute != null) - { - // Override the "use" field with - refXSDAttribute.Use = attribute.use.ToString(); - } - return null; - } - else // Reference not found! - { - type = QualifiedNameToAttributeTypeName(attribute.@ref); - name = attribute.@ref.Name; - nameSpace = attribute.@ref.Namespace; - isReference = true; - } - } - else if (attribute.type != null) - { - type = QualifiedNameToAttributeTypeName(attribute.type); - nameSpace = attribute.type.Namespace; - } - else if (attribute.simpleType != null) - { - XMLSchema.simpleType simpleType = attribute.simpleType as XMLSchema.simpleType; - if (simpleType.Item is XMLSchema.restriction) - { - XMLSchema.restriction restriction = simpleType.Item as XMLSchema.restriction; - type = QualifiedNameToAttributeTypeName(restriction.@base); - nameSpace = restriction.@base.Namespace; - } - else if (simpleType.Item is XMLSchema.list) - { - XMLSchema.list list = simpleType.Item as XMLSchema.list; - type = QualifiedNameToAttributeTypeName(list.itemType); - nameSpace = list.itemType.Namespace; - } - else - { - } - } - else - { - - } - if (string.IsNullOrEmpty(attribute.name) && string.IsNullOrEmpty(name)) - { - } - if (isRestriction) - { - if (attribute.use == XMLSchema.attributeUse.prohibited) - { - foreach (XSDAttribute xsdAttribute in listAttributes) - { - if (xsdAttribute.Name == name) - { - //listAttributes.Remove(xsdAttribute); - xsdAttribute.Use = attribute.use.ToString(); - break; - } - } - } - } - else - { - XSDAttribute xsdAttribute = new XSDAttribute(filename, name, nameSpace, type, isReference, attribute.@default, attribute.use.ToString(), attribute); - listAttributes.Insert(0, xsdAttribute); - return xsdAttribute; - - } - return null; - } - - private void ParseAttributeGroup(string nameSpace, List listAttributes, XMLSchema.attributeGroup attributeGroup, bool isRestriction) - { - if (attributeGroup is XMLSchema.attributeGroupRef && attributeGroup.@ref != null) - { - object o = null; - this.schema.AttributesByName.TryGetValue(QualifiedNameToFullName("attributeGroup", attributeGroup.@ref), out o); - if (o is XSDAttributeGroup) - { - XSDAttributeGroup xsdAttributeGroup = o as XSDAttributeGroup; - XMLSchema.attributeGroup attributeGroupInstance = xsdAttributeGroup.Tag; - - foreach (XMLSchema.annotated annotated in attributeGroupInstance.Items) - { - if (annotated is XMLSchema.attribute) - { - ParseAttribute(nameSpace, listAttributes, annotated as XMLSchema.attribute, isRestriction); - } - else if (annotated is XMLSchema.attributeGroup) - { - ParseAttributeGroup(nameSpace, listAttributes, annotated as XMLSchema.attributeGroup, isRestriction); - } - } - } - } - else - { - - } - } - - private static string QualifiedNameToFullName(string type, System.Xml.XmlQualifiedName xmlQualifiedName) - { - return xmlQualifiedName.Namespace + ':' + type + ':' + xmlQualifiedName.Name; - } - - private static string QualifiedNameToAttributeTypeName(System.Xml.XmlQualifiedName xmlQualifiedName) - { - return xmlQualifiedName.Name + " : " + xmlQualifiedName.Namespace; - } - private void ShowEnumerate(XMLSchema.attribute attribute) { this.listViewEnumerate.Items.Clear(); @@ -971,10 +670,10 @@ namespace XSDDiagram { if (attribute.type != null) { - //XSDObject xsdObject = this.schema.ElementsByName[QualifiedNameToFullName("type", attribute.type)] as XSDObject; + //XSDObject xsdObject = this.schema.ElementsByName[DiagramHelpers.QualifiedNameToFullName("type", attribute.type)] as XSDObject; //if (xsdObject != null) XSDObject xsdObject; - if (this.schema.ElementsByName.TryGetValue(QualifiedNameToFullName("type", attribute.type), out xsdObject) && xsdObject != null) + if (this.schema.ElementsByName.TryGetValue(DiagramHelpers.QualifiedNameToFullName("type", attribute.type), out xsdObject) && xsdObject != null) { XMLSchema.annotated annotatedElement = xsdObject.Tag as XMLSchema.annotated; if (annotatedElement is XMLSchema.simpleType) @@ -997,10 +696,10 @@ namespace XSDDiagram XMLSchema.element element = annotated as XMLSchema.element; if (element != null && element.type != null) { - //XSDObject xsdObject = this.schema.ElementsByName[QualifiedNameToFullName("type", element.type)] as XSDObject; + //XSDObject xsdObject = this.schema.ElementsByName[DiagramHelpers.QualifiedNameToFullName("type", element.type)] as XSDObject; //if (xsdObject != null) XSDObject xsdObject; - if (this.schema.ElementsByName.TryGetValue(QualifiedNameToFullName("type", element.type), out xsdObject) && xsdObject != null) + if (this.schema.ElementsByName.TryGetValue(DiagramHelpers.QualifiedNameToFullName("type", element.type), out xsdObject) && xsdObject != null) { XMLSchema.annotated annotatedElement = xsdObject.Tag as XMLSchema.annotated; if (annotatedElement is XMLSchema.simpleType) @@ -1081,49 +780,37 @@ namespace XSDDiagram return; } - foreach (object o in annotation.Items) - { - if (o is XMLSchema.documentation) - { - XMLSchema.documentation documentation = o as XMLSchema.documentation; - if (documentation.Any != null && documentation.Any.Length > 0 && documentation.Any[0].Value != null) - { - string text = documentation.Any[0].Value; - text = text.Replace("\n", " "); - text = text.Replace("\t", " "); - text = text.Replace("\r", ""); - text = Regex.Replace(text, " +", " "); - text = text.Trim(); - - //text = text.Replace(, " "); - - //text = text.Trim('\n', '\t', '\r', ' '); - //string[] textLines = text.Split(new char[] { '\n' }); - //for (int i = 0; i < textLines.Length; i++) - // textLines[i] = textLines[i].Trim('\n', '\t', '\r', ' '); - //text = string.Join("\r\n", textLines); - this.textBoxAnnotation.Text = text; - this.textBoxAnnotation.Visible = true; - if (this.webBrowserDocumentation != null) - this.webBrowserDocumentation.Visible = false; - } - else if (documentation.source != null) - { + bool isWebDocumentation = false; + Uri uriResult; + foreach (object o in annotation.Items) + { + if (o is XMLSchema.documentation) + { + XMLSchema.documentation documentation = o as XMLSchema.documentation; + if (documentation.Any != null && documentation.Any.Length > 0 && documentation.Any[0].Value != null) + { + } + else if (documentation.source != null && Uri.TryCreate(documentation.source, UriKind.Absolute, out uriResult) && (uriResult.Scheme == Uri.UriSchemeHttp || uriResult.Scheme == Uri.UriSchemeHttps)) + { if (this.webBrowserDocumentation != null) { + isWebDocumentation = true; this.textBoxAnnotation.Visible = false; this.webBrowserDocumentation.Visible = true; this.webBrowserDocumentation.Navigate(documentation.source); } - else - { - this.textBoxAnnotation.Text = documentation.source; - this.textBoxAnnotation.Visible = true; - } - } - break; - } - } + } + break; + } + } + + if(!isWebDocumentation) + { + this.textBoxAnnotation.Text = DiagramHelpers.GetAnnotationText(annotation); + this.textBoxAnnotation.Visible = true; + if (this.webBrowserDocumentation != null) + this.webBrowserDocumentation.Visible = false; + } } private void listViewAttributes_SelectedIndexChanged(object sender, EventArgs e) diff --git a/Options.cs b/Options.cs index 73da473..68a0e73 100644 --- a/Options.cs +++ b/Options.cs @@ -37,6 +37,7 @@ namespace XSDDiagram public static string Username { get; private set; } public static string Password { get; private set; } public static IList TextOutputFields { get; private set; } + public static bool DisplayAttributes { get; private set; } public static bool NoGUI { get; private set; } static Options() @@ -52,6 +53,7 @@ namespace XSDDiagram ForceHugeImageGeneration = false; RequestHelp = false; TextOutputFields = new List(); + DisplayAttributes = false; NoGUI = false; IsRunningOnMono = Type.GetType("Mono.Runtime") != null; @@ -157,6 +159,10 @@ namespace XSDDiagram TextOutputFields.Add(field.Trim()); } } + else if (string.Compare("-a", argument, true) == 0) + { + DisplayAttributes = true; + } else if (string.Compare("-no-gui", argument, true) == 0) { NoGUI = true; diff --git a/Program.cs b/Program.cs index 0dd8b6d..472413f 100644 --- a/Program.cs +++ b/Program.cs @@ -35,7 +35,7 @@ namespace XSDDiagram //static extern bool AllocConsole(); static string usage = @"XSD Diagram, version {0} -Usage: {1} [-o output.svg] [-os EXTENSION] [-r RootElement[@namespace]]* [-e N] [-d] [-z N] [-f PATH,NAME,TYPE,NAMESPACE,COMMENT] [-y] [-u USERNAME] [-p PASSWORD] [file.xsd or URL] +Usage: {1} [-o output.svg] [-os EXTENSION] [-r RootElement[@namespace]]* [-e N] [-d] [-z N] [-f PATH,NAME,TYPE,NAMESPACE,COMMENT] [-a] [-y] [-u USERNAME] [-p PASSWORD] [file.xsd or URL] -o FILE specifies the output image. '.png','.jpg', '.svg', '.txt', '.csv' ('.emf' on Windows) are allowed. @@ -58,6 +58,8 @@ Usage: {1} [-o output.svg] [-os EXTENSION] [-r RootElement[@namespace]]* [-e N] Work only with the '-o', '-os png' or '-os jpg' option. -f PATH,NAME,TYPE,NAMESPACE,COMMENT specifies the fields you want to output when rendering to a txt or csf file. +-a + outputs the attributes in text mode only (.txt and .csv). -y force huge image generation without user prompt. -u USERNAME @@ -90,7 +92,7 @@ Example 4: 'TotoRoot' and expanding the tree from the root until the 3rd level. Example 5: -> XSDDiagramConsole.exe -os txt -r TotoRoot -e 3 -f NAME,TYPE,COMMENT ./folder1/toto.xsd +> XSDDiagramConsole.exe -os txt -r TotoRoot -e 3 -f PATH,TYPE,COMMENT -a ./folder1/toto.xsd will write a textual representation in the standard output from a diagram with a root element 'TotoRoot' and expanding the tree from the root until the 3rd level. "; @@ -197,8 +199,10 @@ Example 5: DiagramExporter exporter = new DiagramExporter(diagram); IDictionary specificRendererParameters = new Dictionary() - { - { "TextOutputFields", Options.TextOutputFields } + { + { "TextOutputFields", Options.TextOutputFields }, + { "DisplayAttributes", Options.DisplayAttributes }, + { "Schema", schema } //For future parameters, {} }; if (Options.OutputOnStdOut) diff --git a/ReadMe.txt b/ReadMe.txt index d59a5ab..5816e31 100644 --- a/ReadMe.txt +++ b/ReadMe.txt @@ -1,6 +1,6 @@ XSD Diagram is a free xml schema definition diagram viewer (http://regis.cosnier.free.fr). -Version 1.2alpha Copyright (c) 2006-2016 Regis Cosnier, All Rights Reserved. +Version 1.2alpha Copyright (c) 2006-2017 Regis Cosnier, All Rights Reserved. This program is free software and may be distributed according to the terms of the GNU General Public License (GPL). @@ -39,7 +39,7 @@ COMMAND LINE USAGE: or on Windows use 'XSDDiagramConsole.exe' instead of 'XSDDiagram.exe' if you need the console: -> XSDDiagramConsole.exe [-o output.svg] [-os EXTENSION] [-r RootElement[@namespace]]* [-e N] [-d] [-z N] [-f PATH,NAME,TYPE,NAMESPACE,COMMENT] [-y] [-u USERNAME] [-p PASSWORD] [file.xsd or URL] +> XSDDiagramConsole.exe [-o output.svg] [-os EXTENSION] [-r RootElement[@namespace]]* [-e N] [-d] [-z N] [-f PATH,NAME,TYPE,NAMESPACE,COMMENT] [-a] [-y] [-u USERNAME] [-p PASSWORD] [file.xsd or URL] Options: @@ -63,6 +63,8 @@ Options: Work only with the '-o', '-os png' or '-os jpg' option. -f PATH,NAME,TYPE,NAMESPACE,COMMENT specifies the fields you want to output when rendering to a txt or csf file. +-a + outputs the attributes in text mode only (.txt and .csv). -y force huge image generation without user prompt. -u USERNAME @@ -96,7 +98,7 @@ Example 4: 'TotoRoot' and expanding the tree from the root until the 3rd level. Example 5: -> XSDDiagramConsole.exe -os txt -r TotoRoot -e 3 -f NAME,TYPE,COMMENT ./folder1/toto.xsd +> XSDDiagramConsole.exe -os txt -r TotoRoot -e 3 -f PATH,TYPE,COMMENT -a ./folder1/toto.xsd will write a textual representation in the standard output from a diagram with a root element 'TotoRoot' and expanding the tree from the root until the 3rd level. @@ -112,7 +114,6 @@ TODO LIST: - Add an icon "Go to Diagram" on tool bar, to help working with lot of includes (Majo). - Show/hide group elements in the settings (Mario M.). - Font look blurry on Windows, add default font size in the settings (Mario M.). -- Multi-(language) documentation (https://github.com/dgis/xsddiagram/issues/8) - Add the infer XSD file in the command line. - NoukNouk suggestions: + Add some display parameter like font type / size for tags / annotation... background color, vertical margin between tags... @@ -136,11 +137,14 @@ TODO LIST: CHANGES: -version 1.2alpha (2016-11-??) +version 1.2alpha (2017-02-??) - Add infer XSD from XML menu. - Fix a null reference exception in the documentation (Thanks Mario M.). - Add the namespace in the command line option -r (Thanks Kevin). - Add the option --no-gui to prevent the UI to be shown (Thanks Kevin). +- Add multi-(language) documentation (https://github.com/dgis/xsddiagram/issues/8). +- Fix the URL escaping in the import (https://github.com/dgis/xsddiagram/issues/11). +- Add the attributes of an element with the option -a for text output only. version 1.1 (2016-07-08) - Fix SVG page size. diff --git a/XSDDiagram.exe b/XSDDiagram.exe index 8dabf850ef9497100db6daaec8869a0ae143ffd7..5fc2e2ce9ce8adc2021e73f862646249c587b887 100644 GIT binary patch delta 93102 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 diff --git a/XSDDiagramConsole.exe b/XSDDiagramConsole.exe index 429564578674b383fe7d565b368856653fff1759..f5b987a3f05bc7f68333884fa4d44ec097959e6d 100644 GIT binary patch delta 85 zcmZqBXwaC@!QAtC?#Av^Hi6$$lxOda+~VI`V-m4Z^sxFS_5em5pkxFC5HJC;3?l*N=7gM0TU3*FfuS? kr~xqt14B@-OYq~qR}5y7+k6(^4wtPtwN-6%4Mz(%08I`V*#H0l diff --git a/XSDDiagrams/DiagramHelpers.cs b/XSDDiagrams/DiagramHelpers.cs new file mode 100644 index 0000000..da9a942 --- /dev/null +++ b/XSDDiagrams/DiagramHelpers.cs @@ -0,0 +1,368 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.Text.RegularExpressions; + +namespace XSDDiagram +{ + ///

+ /// Helper functions to work with the diagram. + /// + public class DiagramHelpers + { + + /// + /// Gives the display string of a type. + /// + /// The type. + /// Name of the XML qualified. + /// + public static string QualifiedNameToFullName(string type, System.Xml.XmlQualifiedName xmlQualifiedName) + { + return xmlQualifiedName.Namespace + ':' + type + ':' + xmlQualifiedName.Name; + } + + private static string QualifiedNameToAttributeTypeName(System.Xml.XmlQualifiedName xmlQualifiedName) + { + return xmlQualifiedName.Name + " : " + xmlQualifiedName.Namespace; + } + + + private static void ParseComplexTypeAttributes(Schema schema, string nameSpace, List listAttributes, XMLSchema.complexType complexType, bool isRestriction) + { + if (complexType.ItemsElementName != null) + { + for (int i = 0; i < complexType.ItemsElementName.Length; i++) + { + switch (complexType.ItemsElementName[i]) + { + case XMLSchema.ItemsChoiceType4.attribute: + { + XMLSchema.attribute attribute = complexType.Items[i] as XMLSchema.attribute; + ParseAttribute(schema, nameSpace, listAttributes, attribute, false); + } + break; + case XMLSchema.ItemsChoiceType4.attributeGroup: + { + XMLSchema.attributeGroup attributeGroup = complexType.Items[i] as XMLSchema.attributeGroup; + ParseAttributeGroup(schema, nameSpace, listAttributes, attributeGroup, false); + } + break; + case XMLSchema.ItemsChoiceType4.anyAttribute: + XMLSchema.wildcard wildcard = complexType.Items[i] as XMLSchema.wildcard; + XSDAttribute xsdAttribute = new XSDAttribute("", "*", wildcard.@namespace, "", false, null, null, null); + listAttributes.Add(xsdAttribute); + break; + case XMLSchema.ItemsChoiceType4.simpleContent: + case XMLSchema.ItemsChoiceType4.complexContent: + XMLSchema.annotated annotatedContent = null; + if (complexType.Items[i] is XMLSchema.complexContent) + { + XMLSchema.complexContent complexContent = complexType.Items[i] as XMLSchema.complexContent; + annotatedContent = complexContent.Item; + } + else if (complexType.Items[i] is XMLSchema.simpleContent) + { + XMLSchema.simpleContent simpleContent = complexType.Items[i] as XMLSchema.simpleContent; + annotatedContent = simpleContent.Item; + } + if (annotatedContent is XMLSchema.extensionType) + { + XMLSchema.extensionType extensionType = annotatedContent as XMLSchema.extensionType; + //XSDObject xsdExtensionType = this.schema.ElementsByName[QualifiedNameToFullName("type", extensionType.@base)] as XSDObject; + //if (xsdExtensionType != null) + XSDObject xsdExtensionType; + if (schema.ElementsByName.TryGetValue(QualifiedNameToFullName("type", extensionType.@base), out xsdExtensionType) && xsdExtensionType != null) + { + XMLSchema.annotated annotatedExtension = xsdExtensionType.Tag as XMLSchema.annotated; + if (annotatedExtension != null) + { + if (annotatedExtension is XMLSchema.complexType) + ParseComplexTypeAttributes(schema, extensionType.@base.Namespace, listAttributes, annotatedExtension as XMLSchema.complexType, false); + } + } + if (extensionType.Items != null) + { + foreach (XMLSchema.annotated annotated in extensionType.Items) + { + if (annotated is XMLSchema.attribute) + { + ParseAttribute(schema, nameSpace, listAttributes, annotated as XMLSchema.attribute, false); + } + else if (annotated is XMLSchema.attributeGroup) + { + ParseAttributeGroup(schema, nameSpace, listAttributes, annotated as XMLSchema.attributeGroup, false); + } + } + } + } + else if (annotatedContent is XMLSchema.restrictionType) + { + XMLSchema.restrictionType restrictionType = annotatedContent as XMLSchema.restrictionType; + //XSDObject xsdRestrictionType = this.schema.ElementsByName[QualifiedNameToFullName("type", restrictionType.@base)] as XSDObject; + //if (xsdRestrictionType != null) + XSDObject xsdRestrictionType; + if (schema.ElementsByName.TryGetValue(QualifiedNameToFullName("type", restrictionType.@base), out xsdRestrictionType) && xsdRestrictionType != null) + { + XMLSchema.annotated annotatedRestriction = xsdRestrictionType.Tag as XMLSchema.annotated; + if (annotatedRestriction != null) + { + if (annotatedRestriction is XMLSchema.complexType) + ParseComplexTypeAttributes(schema, restrictionType.@base.Namespace, listAttributes, annotatedRestriction as XMLSchema.complexType, false); + } + } + if (restrictionType.Items1 != null) + { + foreach (XMLSchema.annotated annotated in restrictionType.Items1) + { + if (annotated is XMLSchema.attribute) + { + ParseAttribute(schema, nameSpace, listAttributes, annotated as XMLSchema.attribute, true); + } + else if (annotated is XMLSchema.attributeGroup) + { + ParseAttributeGroup(schema, nameSpace, listAttributes, annotated as XMLSchema.attributeGroup, true); + } + } + } + } + break; + } + } + } + else + { + } + } + + private static XSDAttribute ParseAttribute(Schema schema, string nameSpace, List listAttributes, XMLSchema.attribute attribute, bool isRestriction) + { + bool isReference = false; + string filename = ""; + string name = attribute.name; + string type = ""; + if (attribute.@ref != null) + { + object o = null; + schema.AttributesByName.TryGetValue(QualifiedNameToFullName("attribute", attribute.@ref), out o); + if (o is XSDAttribute) + { + XSDAttribute xsdAttributeInstance = o as XSDAttribute; + XSDAttribute refXSDAttribute = ParseAttribute(schema, nameSpace, listAttributes, xsdAttributeInstance.Tag, isRestriction); + if (refXSDAttribute != null) + { + // Override the "use" field with + refXSDAttribute.Use = attribute.use.ToString(); + } + return null; + } + else // Reference not found! + { + type = QualifiedNameToAttributeTypeName(attribute.@ref); + name = attribute.@ref.Name; + nameSpace = attribute.@ref.Namespace; + isReference = true; + } + } + else if (attribute.type != null) + { + type = QualifiedNameToAttributeTypeName(attribute.type); + nameSpace = attribute.type.Namespace; + } + else if (attribute.simpleType != null) + { + XMLSchema.simpleType simpleType = attribute.simpleType as XMLSchema.simpleType; + if (simpleType.Item is XMLSchema.restriction) + { + XMLSchema.restriction restriction = simpleType.Item as XMLSchema.restriction; + type = QualifiedNameToAttributeTypeName(restriction.@base); + nameSpace = restriction.@base.Namespace; + } + else if (simpleType.Item is XMLSchema.list) + { + XMLSchema.list list = simpleType.Item as XMLSchema.list; + type = QualifiedNameToAttributeTypeName(list.itemType); + nameSpace = list.itemType.Namespace; + } + else + { + } + } + else + { + + } + if (string.IsNullOrEmpty(attribute.name) && string.IsNullOrEmpty(name)) + { + } + if (isRestriction) + { + if (attribute.use == XMLSchema.attributeUse.prohibited) + { + foreach (XSDAttribute xsdAttribute in listAttributes) + { + if (xsdAttribute.Name == name) + { + //listAttributes.Remove(xsdAttribute); + xsdAttribute.Use = attribute.use.ToString(); + break; + } + } + } + } + else + { + XSDAttribute xsdAttribute = new XSDAttribute(filename, name, nameSpace, type, isReference, attribute.@default, attribute.use.ToString(), attribute); + listAttributes.Insert(0, xsdAttribute); + return xsdAttribute; + + } + return null; + } + + private static void ParseAttributeGroup(Schema schema, string nameSpace, List listAttributes, XMLSchema.attributeGroup attributeGroup, bool isRestriction) + { + if (attributeGroup is XMLSchema.attributeGroupRef && attributeGroup.@ref != null) + { + object o = null; + schema.AttributesByName.TryGetValue(QualifiedNameToFullName("attributeGroup", attributeGroup.@ref), out o); + if (o is XSDAttributeGroup) + { + XSDAttributeGroup xsdAttributeGroup = o as XSDAttributeGroup; + XMLSchema.attributeGroup attributeGroupInstance = xsdAttributeGroup.Tag; + + foreach (XMLSchema.annotated annotated in attributeGroupInstance.Items) + { + if (annotated is XMLSchema.attribute) + { + ParseAttribute(schema, nameSpace, listAttributes, annotated as XMLSchema.attribute, isRestriction); + } + else if (annotated is XMLSchema.attributeGroup) + { + ParseAttributeGroup(schema, nameSpace, listAttributes, annotated as XMLSchema.attributeGroup, isRestriction); + } + } + } + } + else + { + + } + } + + private static List GetComplexTypeAttributes(Schema schema, XMLSchema.complexType complexType, string nameSpace) + { + List listAttributes = new List(); + DiagramHelpers.ParseComplexTypeAttributes(schema, nameSpace, listAttributes, complexType, false); + return listAttributes; + } + + /// + /// Gets the annotated attributes. + /// + /// The schema. + /// The annotated. + /// The name space. + /// The list of all the attributes. + public static List GetAnnotatedAttributes(Schema schema, XMLSchema.annotated annotated, string nameSpace) + { + // Attributes enumeration + List listAttributes = new List(); + if (annotated is XMLSchema.element) + { + XMLSchema.element element = annotated as XMLSchema.element; + + if (element.Item is XMLSchema.complexType) + { + XMLSchema.complexType complexType = element.Item as XMLSchema.complexType; + listAttributes.AddRange(GetComplexTypeAttributes(schema, complexType, nameSpace)); + } + else if (element.type != null) + { + //XSDObject xsdObject = this.schema.ElementsByName[DiagramHelpers.QualifiedNameToFullName("type", element.type)] as XSDObject; + //if (xsdObject != null) + XSDObject xsdObject; + if (schema.ElementsByName.TryGetValue(DiagramHelpers.QualifiedNameToFullName("type", element.type), out xsdObject) && xsdObject != null) + { + XMLSchema.annotated annotatedElement = xsdObject.Tag as XMLSchema.annotated; + if (annotatedElement is XMLSchema.complexType) + { + XMLSchema.complexType complexType = annotatedElement as XMLSchema.complexType; + listAttributes.AddRange(GetComplexTypeAttributes(schema, complexType, nameSpace)); + } + else + { + } + } + else + { + } + } + else + { + } + } + else if (annotated is XMLSchema.complexType) + { + XMLSchema.complexType complexType = annotated as XMLSchema.complexType; + listAttributes.AddRange(GetComplexTypeAttributes(schema, complexType, nameSpace)); + } + else if (annotated is XMLSchema.simpleType) + { + XMLSchema.attribute attr = new XMLSchema.attribute(); + XMLSchema.localSimpleType def = new XMLSchema.localSimpleType(); + def.Item = (annotated as XMLSchema.simpleType).Item; + attr.simpleType = def; + string type = ""; + if (def.Item is XMLSchema.restriction) type = (def.Item as XMLSchema.restriction).@base.Name; + XSDAttribute XSDattr = new XSDAttribute("filename", (annotated as XMLSchema.simpleType).name, "namespace", type, false, "", "", attr); + listAttributes.Add(XSDattr); + + } + return listAttributes; + } + + + public static string GetAnnotationText(XMLSchema.annotation annotation) + { + string textDocumentation = ""; + foreach (object o in annotation.Items) + { + if (o is XMLSchema.documentation) + { + string text = ""; + XMLSchema.documentation documentation = o as XMLSchema.documentation; + if (documentation.Any != null && documentation.Any.Length > 0 && documentation.Any[0].Value != null) + { + text = documentation.Any[0].Value; + text = text.Replace("\n", " "); + text = text.Replace("\t", " "); + text = text.Replace("\r", ""); + text = Regex.Replace(text, " +", " "); + text = text.Trim(); + } + else if (documentation.source != null) + { + text = documentation.source; + } + if(!string.IsNullOrEmpty(textDocumentation)) + textDocumentation += "\r\n"; + textDocumentation += text; + if (!string.IsNullOrEmpty(documentation.lang) || !string.IsNullOrEmpty(documentation.source)) + { + textDocumentation += " ("; + if (!string.IsNullOrEmpty(documentation.lang)) + textDocumentation += documentation.lang; + if (!string.IsNullOrEmpty(documentation.lang) && !string.IsNullOrEmpty(documentation.source)) + textDocumentation += ", "; + if (!string.IsNullOrEmpty(documentation.source)) + textDocumentation += documentation.source; + textDocumentation += ")"; + } + } + } + + return textDocumentation; + } + } +} diff --git a/XSDDiagrams/Parsing/Schema.cs b/XSDDiagrams/Parsing/Schema.cs index b354f32..025e9c9 100644 --- a/XSDDiagrams/Parsing/Schema.cs +++ b/XSDDiagrams/Parsing/Schema.cs @@ -163,6 +163,8 @@ namespace XSDDiagram if (!string.IsNullOrEmpty(schemaLocation)) { + schemaLocation = Uri.UnescapeDataString(schemaLocation); + loadedFileName = basePath + Path.DirectorySeparatorChar + schemaLocation.Replace('/', Path.DirectorySeparatorChar); string url = schemaLocation.Trim(); @@ -260,7 +262,7 @@ namespace XSDDiagram { uri = new Uri(url); } - catch (UriFormatException) + catch (UriFormatException ex) { throw new Exception("Cannot read the URL '" + url + "'!"); } diff --git a/XSDDiagrams/Rendering/Diagram.cs b/XSDDiagrams/Rendering/Diagram.cs index 4e5a689..c6b6707 100644 --- a/XSDDiagrams/Rendering/Diagram.cs +++ b/XSDDiagrams/Rendering/Diagram.cs @@ -41,7 +41,7 @@ namespace XSDDiagram.Rendering private List _rootElements; private DiagramItem _selectedElement; - private XMLSchema.any _fakeAny; + private XMLSchema.any _fakeAny; #endregion diff --git a/XSDDiagrams/Rendering/DiagramExporter.cs b/XSDDiagrams/Rendering/DiagramExporter.cs index ca7e41e..953f009 100644 --- a/XSDDiagrams/Rendering/DiagramExporter.cs +++ b/XSDDiagrams/Rendering/DiagramExporter.cs @@ -68,10 +68,10 @@ namespace XSDDiagram.Rendering DiagramAlertHandler alerteDelegate, IDictionary specificRendererParameters) { string extension = Path.GetExtension(outputFilename).ToLower(); - if (string.IsNullOrEmpty(extension)) - { - extension = ".svg"; - outputFilename += extension; + if (string.IsNullOrEmpty(extension)) + { + extension = ".svg"; + outputFilename += extension; } using (FileStream stream = File.Create(outputFilename)) { @@ -97,10 +97,10 @@ namespace XSDDiagram.Rendering { _diagram.Scale = 1.0f; _diagram.Layout(referenceGraphics); - + IntPtr hdc = referenceGraphics.GetHdc(); - Metafile metafile = new Metafile(stream, hdc); - Graphics graphics = Graphics.FromImage(metafile); + Metafile metafile = new Metafile(stream, hdc); + Graphics graphics = Graphics.FromImage(metafile); graphics.SmoothingMode = SmoothingMode.HighQuality; _diagram.Layout(graphics); DiagramGdiRenderer.Draw(_diagram, graphics); @@ -117,13 +117,13 @@ namespace XSDDiagram.Rendering } } else if (extension.Equals(".png", StringComparison.OrdinalIgnoreCase) || - extension.Equals(".jpg", StringComparison.OrdinalIgnoreCase) || + extension.Equals(".jpg", StringComparison.OrdinalIgnoreCase) || extension.Equals(".jpeg", StringComparison.OrdinalIgnoreCase)) { Rectangle bbox = _diagram.ScaleRectangle(_diagram.BoundingBox); bool bypassAlert = true; if (alerteDelegate != null && (bbox.Width > 10000 || bbox.Height > 10000)) - bypassAlert = alerteDelegate("Huge image generation", + bypassAlert = alerteDelegate("Huge image generation", String.Format("Do you agree to generate a {0}x{1} image?", bbox.Width, bbox.Height)); if (bypassAlert) { @@ -153,8 +153,14 @@ namespace XSDDiagram.Rendering renderer.IsCSV = extension.CompareTo(".csv") == 0; IDictionary parameters = specificRendererParameters as IDictionary; object o; - if (parameters != null && parameters.TryGetValue("TextOutputFields", out o)) - renderer.TextOutputFields = o as IList; + if (parameters != null) { + if (parameters.TryGetValue("TextOutputFields", out o)) + renderer.TextOutputFields = o as IList; + if (parameters.TryGetValue("DisplayAttributes", out o) && o is bool) + renderer.DisplayAttributes = (bool)o; + if (parameters.TryGetValue("Schema", out o)) + renderer.Schema = o as Schema; + } renderer.Render(_diagram); } diff --git a/XSDDiagrams/Rendering/DiagramItem.cs b/XSDDiagrams/Rendering/DiagramItem.cs index 464dd07..3ed1727 100644 --- a/XSDDiagrams/Rendering/DiagramItem.cs +++ b/XSDDiagrams/Rendering/DiagramItem.cs @@ -490,28 +490,30 @@ namespace XSDDiagram.Rendering XMLSchema.annotated annotated = this.TabSchema as XMLSchema.annotated; if (annotated != null && annotated.annotation != null) { - foreach (object o in annotated.annotation.Items) - { - if (o is XMLSchema.documentation) - { - XMLSchema.documentation documentation = o as XMLSchema.documentation; - if (documentation.Any != null && documentation.Any.Length > 0 && documentation.Any[0].Value != null) - { - text = documentation.Any[0].Value; - text = text.Replace("\n", " "); - text = text.Replace("\t", " "); - text = text.Replace("\r", ""); - text = Regex.Replace(text, " +", " "); - text = text.Trim(); - } - else if (documentation.source != null) - { - text = documentation.source; - } + text = DiagramHelpers.GetAnnotationText(annotated.annotation); - break; - } - } + //foreach (object o in annotated.annotation.Items) + //{ + // if (o is XMLSchema.documentation) + // { + // XMLSchema.documentation documentation = o as XMLSchema.documentation; + // if (documentation.Any != null && documentation.Any.Length > 0 && documentation.Any[0].Value != null) + // { + // text = documentation.Any[0].Value; + // text = text.Replace("\n", " "); + // text = text.Replace("\t", " "); + // text = text.Replace("\r", ""); + // text = Regex.Replace(text, " +", " "); + // text = text.Trim(); + // } + // else if (documentation.source != null) + // { + // text = documentation.source; + // } + // + // break; + // } + //} } return text; diff --git a/XSDDiagrams/Rendering/DiagramTxtRenderer.cs b/XSDDiagrams/Rendering/DiagramTxtRenderer.cs index 5029c34..67da624 100644 --- a/XSDDiagrams/Rendering/DiagramTxtRenderer.cs +++ b/XSDDiagrams/Rendering/DiagramTxtRenderer.cs @@ -28,6 +28,8 @@ namespace XSDDiagram.Rendering private string _fieldSeparator; private IList _textOutputFields; private IList _finalTextOutputFields; + private bool _displayAttributes; + private Schema _schema; private static List fields = new List() { "PATH", "NAME", "TYPE", "NAMESPACE", "COMMENT" @@ -91,7 +93,30 @@ namespace XSDDiagram.Rendering } } - + public bool DisplayAttributes + { + get + { + return _displayAttributes; + } + set + { + _displayAttributes = value; + } + } + + public Schema Schema + { + get + { + return _schema; + } + set + { + _schema = value; + } + } + #endregion @@ -115,6 +140,10 @@ namespace XSDDiagram.Rendering { } + /// + /// Renders the specified diagram. + /// + /// The diagram. public override void Render(Diagram diagram) { _fieldSeparator = IsCSV ? "," : "\t"; @@ -137,6 +166,10 @@ namespace XSDDiagram.Rendering this.EndItemsRender(); } + /// + /// Renders the specified drawing item. + /// + /// The drawing item. public override void Render(DiagramItem drawingItem) { string type = ""; @@ -159,6 +192,7 @@ namespace XSDDiagram.Rendering parentElement = parentElement.Parent; } + // Get the comment/documentation string comment = ""; XMLSchema.annotated annotated = drawingItem.TabSchema as XMLSchema.annotated; if (annotated != null && annotated.annotation != null) @@ -187,6 +221,7 @@ namespace XSDDiagram.Rendering } } + // Output the item for (int i = 0; i < _finalTextOutputFields.Count; i++) { if (i > 0) @@ -204,6 +239,48 @@ namespace XSDDiagram.Rendering _writer.WriteLine(); + // Output the item attributes + if (this.Schema != null && this.DisplayAttributes) + { + string nameSpace = drawingItem.NameSpace; + if (annotated != null) + { + // Attributes enumeration + List listAttributes = DiagramHelpers.GetAnnotatedAttributes(this.Schema, annotated, nameSpace); + listAttributes.Reverse(); + for (int a = 0; a < listAttributes.Count; a++) + { + XSDAttribute xsdAttribute = listAttributes[a]; + if(xsdAttribute != null) + { + string commentAttribute = ""; + XMLSchema.attribute attribute = xsdAttribute.Tag; + if (attribute != null && attribute.annotation != null) + commentAttribute = DiagramHelpers.GetAnnotationText(attribute.annotation); + + for (int i = 0; i < _finalTextOutputFields.Count; i++) + { + if (i > 0) + _writer.Write(_fieldSeparator); + string field = _finalTextOutputFields[i]; + switch (field) + { + case "PATH": _writer.Write(path + "@" + xsdAttribute.Name); break; + case "NAME": _writer.Write(drawingItem.Name + "@" + xsdAttribute.Name); break; + case "TYPE": _writer.Write(xsdAttribute.Type); break; + case "NAMESPACE": _writer.Write(xsdAttribute.NameSpace); break; + case "COMMENT": _writer.Write(commentAttribute); break; + } + } + _writer.WriteLine(); + } + + //this.listViewAttributes.Items.Add(new ListViewItem(new string[] { attribute.Name, attribute.Type, attribute.Use, attribute.DefaultValue, s })).Tag = attribute; + } + } + } + + //// Draw the inheritor line //if (drawingItem.InheritFrom != null) //{ diff --git a/XSDDiagrams/XSDDiagrams2010.csproj b/XSDDiagrams/XSDDiagrams2010.csproj index 3575969..35a9501 100644 --- a/XSDDiagrams/XSDDiagrams2010.csproj +++ b/XSDDiagrams/XSDDiagrams2010.csproj @@ -61,6 +61,7 @@ + diff --git a/test.bat b/test.bat index b999183..9c51c42 100644 --- a/test.bat +++ b/test.bat @@ -12,6 +12,6 @@ start "" /wait XSDDiagramConsole.exe -o Tests\fileDoc.svg -r COLLADA -e 2 -d Tes XSDDiagramConsole.exe -os png -r COLLADA -e 3 -y Tests\COLLADASchema_141.xsd > Tests\stdout.png XSDDiagramConsole.exe -os jpg -r COLLADA -e 3 -y Tests\COLLADASchema_141.xsd > Tests\stdout.jpg XSDDiagramConsole.exe -os svg -r COLLADA -e 3 -y Tests\COLLADASchema_141.xsd > Tests\stdout.svg -XSDDiagramConsole.exe -os txt -r COLLADA -e 2 -f NAME,TYPE,COMMENT Tests\COLLADASchema_141.xsd +XSDDiagramConsole.exe -os txt -r COLLADA -e 2 -f NAME,TYPE,COMMENT -a Tests\COLLADASchema_141.xsd XSDDiagramConsole.exe -h @pause